본문 바로가기
Category/Python

딕셔너리 확장 자료구조 Counter 사용하기

by Corinee 2024. 11. 20.
728x90
반응형

Counter는 딕셔너리와 비슷하지만, 딕셔너리를 확장한 특화된 자료구조입니다. Python의 collections 모듈에서 제공하는 자료구조로, 요소의 개수를 자동으로 세는 데 최적화되어 있습니다.

Counter와 dict의 공통점

1. 키-값 저장:

Counter도 딕셔너리처럼 키와 값을 저장합니다.

키는 요소를, 값은 해당 요소의 개수를 나타냅니다.

from collections import Counter

c = Counter("hello")
print(c)  # Counter({'l': 2, 'h': 1, 'e': 1, 'o': 1})

 

2. 딕셔너리 메서드 지원:

keys(), values(), items() 등의 메서드를 사용할 수 있습니다.

print(c.keys())  # dict_keys(['h', 'e', 'l', 'o'])
print(c.values())  # dict_values([1, 1, 2, 1])
print(c.items())  # dict_items([('h', 1), ('e', 1), ('l', 2), ('o', 1)])

 

3. 인덱싱:

딕셔너리처럼 키로 값을 조회할 수 있습니다.

print(c['l'])  # 2
print(c['z'])  # 0 (존재하지 않는 키의 기본값은 0)

 

4. 반복문:

딕셔너리처럼 for key in Counter 형태로 키를 반복할 수 있습니다.

for key in c:
    print(key, c[key])
# 출력:
# h 1
# e 1
# l 2
# o 1

Counter와 dict의 차이점

1. 값의 기본값:

Counter는 존재하지 않는 키의 값을 기본적으로 0으로 반환합니다.

일반 딕셔너리는 존재하지 않는 키를 조회하면 KeyError를 발생시킵니다.

c = Counter("hello")
print(c['z'])  # 0 (존재하지 않는 키지만 기본값이 0)

d = {}
# print(d['z'])  # KeyError

 

2. 요소 개수를 자동으로 세기:

Counter는 요소의 개수를 자동으로 계산합니다.

c = Counter("hello")
print(c)  # Counter({'l': 2, 'h': 1, 'e': 1, 'o': 1})

 

3. 수학 연산 지원:

Counter는 덧셈, 뺄셈, 교집합, 합집합 등의 수학 연산을 지원합니다.

c1 = Counter("hello")
c2 = Counter("world")

print(c1 + c2)  # Counter({'l': 3, 'o': 2, 'h': 1, 'e': 1, 'w': 1, 'r': 1, 'd': 1})
print(c1 - c2)  # Counter({'l': 2, 'h': 1, 'e': 1})
print(c1 & c2)  # Counter({'l': 1, 'o': 1})
print(c1 | c2)  # Counter({'l': 2, 'o': 1, 'h': 1, 'e': 1, 'w': 1, 'r': 1, 'd': 1})

 

4. 특화된 메서드:

  • Counter는 딕셔너리에는 없는 메서드를 제공합니다.
  • 예: elements(), most_common(), subtract().
c = Counter("hello")

# elements() → 요소를 빈도만큼 반복
print(list(c.elements()))  # ['h', 'e', 'l', 'l', 'o']

# most_common() → 가장 빈도가 높은 요소
print(c.most_common(1))  # [('l', 2)]

# subtract() → 요소 개수 빼기
c.subtract("ell")
print(c)  # Counter({'l': 1, 'h': 1, 'o': 1, 'e': 0})

언제 Counter를 사용해야 할까?

1. 요소의 빈도 계산:

문자열, 리스트, 튜플 등에서 각 요소가 몇 번 등장했는지 계산할 때 유용합니다.

c = Counter("banana")
print(c)  # Counter({'a': 3, 'n': 2, 'b': 1})

 

2. 차집합 계산:

두 컬렉션 간의 요소 차이를 구할 때 편리합니다.

c1 = Counter("banana")
c2 = Counter("apple")
print(c1 - c2)  # Counter({'n': 2, 'b': 1})

 

3. 가장 빈도 높은 요소 찾기:

데이터를 정렬하지 않고도 가장 많이 등장한 요소를 빠르게 찾을 수 있습니다.

c = Counter([1, 2, 3, 1, 2, 1])
print(c.most_common(1))  # [(1, 3)]

 

4. 데이터 합치기 및 연산:

  • 여러 카운터를 합치거나 연산할 때 간결하게 처리할 수 있습니다.