파이썬 Counter 사용하기

2 minute read

파이썬의 Counter 클래스는 iterable의 원소의 개수를 셀 때 편리하게 사용할 수 있는 기능으로, 딕셔너리 객체와 유사하다. 유니크한 원소의 이름들은 딕셔너리 key로, 각 원소의 카운트는 딕셔너리의 value로 저장된다.

from collections import Counter

string_ex = 'aaaaabbbbbbccccccaaaaddddd'
c1 = Counter(string_ex)
c1 # Counter({'a': 9, 'b': 6, 'c': 6, 'd': 5})

list_ex = [1, 2, 3, 3, 3, 5, 2, 7]
c2 = Counter(list_ex)
c2 # Counter({1: 1, 2: 2, 3: 3, 5: 1, 7: 1})

dir()을 이용해 어떤 메서드를 활용해볼 수 있는지 알아보자. 딕셔너리 기반인 만큼, 딕셔너리에서 사용되는 메서드들이 포함되어 있는 것이 눈에 띈다.

dir(c1)
[ .
  .
  .,
 'clear',
 'copy',
 'elements',
 'fromkeys',
 'get',
 'items',
 'keys',
 'most_common',
 'pop',
 'popitem',
 'setdefault',
 'subtract',
 'update',
 'values']
  • clear() : 카운터 객체에서 모든 key-value 쌍을 제거
  • copy() : 카운터 객체의 복사본을 반환
  • elements() : 카운터 숫자만큼 요소 반환
    • 리스트를 가지고 카운터 객체를 만들었다면, 다시 리스트로 돌린다고 생각하면 쉽다. 물론 순서는 바뀐다. list(c2.elements())와 같이 사용.
  • get() : 인자로 key를 입력하면 해당 key와 매칭되는 value를 반환
  • items() : key, value 쌍을 튜플 형태로 반환
  • keys() : 카운터 객체의 key들을 반환
  • most_common() : 가장 빈도수가 높은 key, value 쌍부터 튜플 형태로 반환. 인자로 숫자(개수)를 전달하면 가장 빈도수가 높은 것부터 해당 개수만큼의 쌍만이 반환됨
  • pop(), popitem()
    • pop() : 인자로 key를 반드시 전달해야 하며, key와 매칭되는 value를 반환하고 해당 key, value 쌍을 카운터 객체에서 제거
    • popitem() : 전달하는 인자가 없어야 하며, 가장 뒤의 key, value 쌍을 튜플 형태로 반환하고 해당 쌍을 카운터 객체에서 제거
  • setdefault() : 카운터 객체에 key, value 쌍을 추가할 때 사용할 수 있음
    • key만 전달하면 카운트 수는 디폴트로 None
    • key와 함께 default=10과 같이 전달하면 key에 해당하는 카운트에 입력한 숫자가 반영됨
  • subtract() : iterable을 전달하면 각 요소의 값을 각각 빼주고 그 결과의 카운트는 마이너스 값을 가질 수도 있음
  • update() : iterable을 전달하여 같은 값이 있으면 카운트가 추가되게 하고 없으면 새로운 key, value 쌍을 생성
  • values() : 카운터 객체의 value, 즉 카운트들을 반환

이 외에 더하기, 빼기, 교집합, 합집합 연산도 가능하다. 빼기 연산에서 카운트가 음수 값을 가지게 만들고 싶다면 subtract()를 사용하자.

c3 = Counter({'a': 3, 'b': 5, 'c': 1, 'd': 4})
c4 = Counter({'a': 1, 'b': 2, 'c': 8, 'e': 4})

c3 + c4 # Counter({'a': 4, 'b': 7, 'c': 9, 'd': 4, 'e': 4})
c3 - c4 # Counter({'a': 2, 'b': 3, 'd': 4})
c3 & c4 # Counter({'a': 1, 'b': 2, 'c': 1})
c3 | c4 # Counter({'a': 3, 'b': 5, 'c': 8, 'd': 4, 'e': 4})

카운트가 양수인 요소만 반환하거나 음수인 요소만 반환할 수도 있다. 아래 방법으로 음수인 요소를 반환하게 되면 카운트는 절댓값을 취해 양수가 된다.

c3.subtract(['a', 'a', 'a', 'a', 'a'])
c3 # Counter({'a': -2, 'b': 5, 'c': 1, 'd': 4})

+c3 # Counter({'b': 5, 'c': 1, 'd': 4})
-c3 # Counter({'a': 2})

Leave a comment