여기서는 딕셔너리 문법보다 정말로 하고 싶은 일이 빈도수 집계인지를 먼저 봅니다.
무언가가 몇 번 나왔는지를 세고, 누적하고, 상위 항목을 뽑는 흐름이면 dict.get(..., 0) + 1보다 Counter가 더 직접적입니다.
숏컷 코드
from collections import Counter
counts = Counter(words)
counts.update(["python", "python"])
top_three = counts.most_common(3)문법
기본형은 빈 카운터, iterable 집계, 매핑 기반 초기화, 누적, 상위 조회를 같이 보면 됩니다.
from collections import Counter
counts = Counter()
counts = Counter(items)
counts = Counter({"error": 3, "warn": 1})
counts.update(more_items)
top = counts.most_common(3)없는 키를 읽었을 때 0처럼 동작한다는 점도 함께 기억해 두면 dict.setdefault()나 get(..., 0)를 직접 열어야 할 상황이 줄어듭니다.
집계 시작
빈도수를 셀 때는 Counter(iterable)부터 본다
가장 기본 패턴은 iterable 하나를 넣어 출현 횟수를 세는 것입니다.
from collections import Counter
counts = Counter(["a", "b", "a"])
print(counts["a"]) # 2집계 의도가 코드에서 즉시 보이고, 누적 루프를 직접 적지 않아도 됩니다.
counts = Counter()
counts.update(["a", "b", "a"])처음부터 다 모아 세지 못하는 흐름이라면 빈 Counter()에서 시작한 뒤 배치별로 얹는 방식도 자연스럽습니다.
누적과 조회
update()와 most_common()으로 집계 흐름을 이어 간다
실전에서는 한 번에 모든 데이터를 세기보다, 로그 조각이나 배치 결과를 여러 번 더하는 경우가 많습니다.
그럴 때 update()가 가장 직접적입니다.
counts = Counter(["error", "info"])
counts.update(["error", "warn"])
print(counts["missing"]) # 0상위 n개를 바로 보고 싶다면 most_common(n)이 뒤에 자연스럽게 붙습니다.
counts = Counter(words)
print(counts.most_common(5))도구 경계
일반 구조 데이터는 dict, 값 모음은 defaultdict가 더 맞다
사용자 정보, 설정값, 옵션 맵처럼 의미 있는 키-값 구조를 담는 문제라면 Counter가 아니라 dict가 맞습니다.
user = {"name": "Mina", "age": 26}같은 키에 여러 값을 모으는 문제는 defaultdict(list)나 수동 누적이 더 맞고, 우선순위 처리나 상위 몇 개를 계속 뽑는 흐름은 heapq가 더 중요합니다.
Counter는 결국 "무언가를 몇 번 봤는가"에 집중된 도구로 읽는 편이 정확합니다.
주의할 점
Counter를 일반 구조 데이터 저장 용도로 쓰면 의도가 흐려집니다. 이 도구는 "몇 번 나왔는가"를 세는 데 특화돼 있습니다.
# ❌ 구조 데이터 저장에는 부자연스러움
from collections import Counter
user = Counter(name="Mina", age=26)
# ✅ 빈도수 집계에 사용
counts = Counter(["error", "info", "error"])참고 링크
2 sources