Table of Contents
  1. Counter
    1. Constructing
    2. elements()
    3. most_common()
    4. subtract()
  2. 마치며

Python 2.7과 3.5부터 탑재된 collectionsCounter에 대해 알아보도록 하겠습니다.


Counter

Counterdict의 하위 클래스로 key와 해당 값의 개수를 카운팅한 value 형태로 이루어진 해쉬 형태의 오브젝트입니다. value는 정수 값을 가질 수 있습니다.

Counter 모듈은 다음과 같이 import하여 사용할 수 있습니다.
1
from collections import Counter

Constructing

Counter는 string, dict, argments, list 등 다양한 방법으로 생성할 수 있으며, 소스코드에서 볼 수 있다시피 Counter는 dict의 하위 클래스로 생성시 O(n)의 시간 복잡도를 가집니다.

1
2
3
4
5
c = Counter()                          # Counter()
c = Counter('gallahad') # Counter({'a': 3, 'l': 2, 'g': 1, 'h': 1, 'd': 1})
c = Counter({'red': 4, 'blue': 2}) # Counter({'red': 4, 'blue': 2})
c = Counter(cats=4, dogs=8) # Counter({'dogs': 8, 'cats': 4})
c = Counter(['eggs', 'ham']) # Counter({'eggs': 1, 'ham': 1})

만약 생성하지 않은 키를 조회한다면 0을 반환합니다.

1
2
c = Counter(['eggs', 'ham'])           # Counter({'eggs': 1, 'ham': 1})
c['sausage'] # 0

Counter는 dict의 하위 클래스이기 때문에 clear() 함수를 이용할 수 있습니다.

1
2
c = Counter(a=4, b=2, c=0, d=-2)     # Counter({'a': 4, 'b': 2, 'c': 0, 'd': -2})
c.clear() # Counter()

elements()

Counter의 elements() 함수는 key를 해당 value 만큼 반복하여 반환합니다.

1
2
c = Counter(a=4, b=2, c=0, d=-2)
list(c.elements()) # ['a', 'a', 'a', 'a', 'b', 'b']

most_common()

Counter의 most_common(N) 함수는 카운팅 값이 높은 순으로 N개의 tuple을 반환합니다. 소스코드를 보면 sort() 함수를 이용하고 있기 때문에 평균 O(nlogn)의 시간 복잡도를 가지고 있다고 볼 수 있습니다. sort()에 대한 자세한 사항은 포스팅을 참고해주세요.

1
Counter('abracadabra').most_common(3)  # [('a', 5), ('b', 2), ('r', 2)]

most_common()[:-N-1:-1]을 이용하면 카운팅 값이 낮은 순으로 N개의 tuple을 가져올 수 있습니다.

1
2
3
c = Counter(a=1, b=2, c=3, d=4, z=3) # Counter({'a': 1, 'b': 2, 'c': 3, 'd': 4, 'z': 3})
c.most_common(2) # [('d', 4), ('c', 3)] - 큰 순으로 앞에서 2개
c.most_common()[:-2-1:-1] # [('a', 1), ('b', 2)] - 작은 순으로 앞에서 2개

subtract()

Counter의 A.subtract(B) 함수는 Counter A에서 B의 값을 빼줍니다. 이 때 B의 값이 A에 존재하지 않거나 A의 값이 더 작은 경우 음의 정수값으로 반환합니다. 이 때 + 기호를 앞에 붙여주는 경우 value가 양의 정수인 값만 반환합니다.

1
2
3
4
5
c = Counter(a=4, b=2, c=0, d=-2)
d = Counter(a=1, b=2, c=3, d=4, z=3)
c.subtract(d)
c # Counter({'a': 3, 'b': 0, 'c': -3, 'd': -6, 'z': -3})
+c # Counter({'a': 3})

Counter 오브젝트는 서로 더하거나 뺄 수 있습니다. 이 때 빼기의 경우 subtract() 함수와 달리 양의 정수 값만을 반환합니다.

1
2
3
4
c = Counter(a=4, b=2, c=0, d=-2)
d = Counter(a=1, b=2, c=3, d=4, z=3)
c - d # Counter({'a': 3})
c + d # Counter({'a': 5, 'b': 4, 'c': 3, 'd': 2, 'z': 3})

마치며

python CollectionsCounter에 대해 알아보았습니다. 더 자세한 사항은 공식문서를 참고하시기 바랍니다.