본문으로 바로가기

[Python] collections모듈 - Counter

category Language/Python 2020. 1. 5. 17:14

collections모듈에도 여러 함수가 있지만

자주 사용되는 함수 위주로 기록합니다✍️


1. Counter함수란?

컨테이너에 동일한 값의 자료가 몇개인지를 파악하는데 사용하는 클래스다.
개수를 세는 것에 특화된 함수!

 

2. 사용법

collections모듈은 파이썬을 설치할 때 자동으로 설치되는 기본 라이브러리이다.

from collections import Counter

lst = ['aa', 'cc', 'dd', 'aa', 'bb', 'ee']
print(Counter(lst))

'''
결과
Counter({'aa': 2, 'cc': 1, 'dd': 1, 'bb': 1, 'ee': 1})
'''

Counter 클래스는 파이썬의 기본 자료구조인 사전(dictionary)를 확장하고 있기 때문에,
딕셔너리에서 제공하는 API를 그대로 다 사용할 수가 있습니다.

 

3. Counter의 메소드

1) update()

Counter의 값을 갱신하는 것을 의미

딕셔너리의 update와 비슷하지만 입력값을 문자열 형태로도 입력 가능

from collections import Counter

a = Counter()
print(a)
a.update("abcdefg")
print(a)

'''
결과
Counter()
Counter({'f': 1, 'e': 1, 'b': 1, 'g': 1, 'c': 1, 'a': 1, 'd': 1})
'''

a.update({'f':3, 'e':2})
print(a)

'''
결과
Counter({'f': 4, 'e': 3, 'b': 1, 'g': 1, 'c': 1, 'a': 1, 'd': 1})
'''

2) elements()

입력된 값의 요소에 해당하는 값을 풀어서 반환

대소문자를 구분하며, sorted()를 이용하여 정렬이 가능

from collections import Counter

c = Counter("Hello Python")
print(list(c.elements()))
print(sorted(c.elements()))

'''
결과
['n', 'h', 'l', 'l', 't', 'H', 'e', 'o', 'o', ' ', 'y', 'P']
[' ', 'H', 'P', 'e', 'h', 'l', 'l', 'n', 'o', 'o', 't', 'y']
'''

3) most_common(n)

딕셔너리의 입력된 값의 요소들 중 빈도수(frequency)가 높은 순으로

상위 n개를 리스트(list) 안의 투플(tuple) 형태로 반환한다. 

n을 입력하지 않은 경우, 요소 전체를 [('값', 개수)]의 형태로 반환한다.

from collections import Counter

c2 = Counter('apple, orange, grape')
print(c2.most_common())
print(c2.most_common(3))

'''
결과
[('a', 3), ('p', 3), ('e', 3), ('g', 2), (',', 2), ('r', 2), (' ', 2), ('n', 1), ('l', 1), ('o', 1)]
[('a', 3), ('p', 3), ('e', 3)]
'''

4) subtract()

말 그대로 요소를 빼는것을 의미

다만, 요소가 없는 경우는 음수의 값이 출력

4. Counter를 이용한 연산

collections.Counter()는 산술/집합 연산이 가능하다.

 

1) 덧셈

from collectios import Counter

a = Counter(['a', 'b', 'c', 'b', 'd', 'a'])
b = Counter('aaeroplane')

print(a)
print(b)
print(a+b)

'''
결과
Counter({'b': 2, 'a': 2, 'd': 1, 'c': 1})
Counter({'a': 3, 'e': 2, 'n': 1, 'r': 1, 'o': 1, 'p': 1, 'l': 1})
Counter({'a': 5, 'b': 2, 'e': 2, 'n': 1, 'l': 1, 'd': 1, 'r': 1, 'o': 1, 'p': 1, 'c': 1})
'''

2) 뺄셈

음수값은 출력하지 않는다.

from collections import Counter

a = Counter('aabbccdd')
b = Counter('abbbce')

print(a-b)

'''
결과
Counter({'d': 2, 'c': 1, 'b': 1, 'a': 1})
'''

3) 교집합(&)과 합집합(|)

출력값은 {값 : 개수}의 딕셔너리 형태로 반환

from collections import Counter

a = Counter('aabbccdd')
b = Counter('aabbbce')

print(a & b)

'''
결과
Counter({'b': 2, 'a': 2, 'c': 1})
'''

print(a | b)

'''
결과
Counter({'b': 3, 'c': 2, 'd': 2, 'a': 2, 'e': 1})
'''