[Python] collections 모듈의 Counter

박지훈·2021년 4월 27일
1

Datastructure

목록 보기
3/7
post-thumbnail
post-custom-banner

[Python] collections 모듈의 Counter

collections 모듈의 Counter 클래스는 컴퓨터 과학에서의 자료구조는 아니다. 하지만, Python 언어에서 지원하는 자료구조라고 생각했기에 자료구조 시리즈에 글을 포스팅하게 되었다.

collections 모듈의 Counter 클래스컨테이너안의 데이터를 편리하고 빠르게 개수를 세도록 지원하는 계수기 도구이다. (링크)
예제를 통해 Counter 클래스의 함수들을 살펴보면 훨씬 이해하기 쉬울 것이다.


리스트(List)

Counter가 무엇인지 볼 수 있다.

import collections

ex_list = ['kim', 'kim', 'park', 'choi', 'kim', 'kim', 'kim', 'choi', 'park', 'choi']
ex_counter = collections.Counter(ex_list)
print(ex_counter)

>>> Counter({'kim': 5, 'choi': 3, 'park': 2})

ex_list = ['kim', 'kim', 'park', 'choi', 'kim', 'kim', 'kim', 'choi', 'park', 'choi']의 요소의 개수를 collections.Counter로 구할 수 있다. ex_counter의 type은 Dictionary자료형이다.


딕셔너리(Dictionary)

import collections

ex_counter = collections.Counter({'김씨': 5, '박씨': 2, '최씨': 3})
print(ex_counter)

>>> Counter({'김씨': 5, '최씨': 3, '박씨': 2})

Dictionary자료형에도 collections.Counter()를 사용할 수 있다. 요소의 개수를 구해주며(요소의 개수가 많은 것 부터 출력함 -> 내림차순), 결과값은 똑같이 Dictionary자료형이다.


값 = 개수 형태

import collections

ex_counter = collections.Counter(김씨=5, 박씨=2, 최씨=3)
print(ex_counter)
# ('김씨' x 5번) + ('박씨' x 2번) + ('최씨' x 3번) 연산을 수행한다.
print(sorted(ex_counter.elements()))

>>> Counter({'김씨': 5, '최씨': 3, '박씨': 2})
>>> ['김씨', '김씨', '김씨', '김씨', '김씨', '박씨', '박씨', '최씨', '최씨', '최씨']

문자열(String)

import collections

ex_counter = collections.Counter()
ex_counter.update('ABCDEFGGGGG')
print(ex_counter)

>>> Counter({'G': 5, 'A': 1, 'B': 1, 'C': 1, 'D': 1, 'E': 1, 'F': 1})

위 예제처럼 문자열의 문자 개수도 구할 수 있다. Dictionary자료형으로 반환하기 때문에 아래 코드를 추가하면 요소와 해당하는 개수를 한쌍으로 꺼낼 수도 있다.

for key, value in ex_counter.items():
    print(key, '가', value, '개 있음!')
    
>>> A 가 1 개 있음!
>>> B 가 1 개 있음!
>>> C 가 1 개 있음!
>>> D 가 1 개 있음!
>>> E 가 1 개 있음!
>>> F 가 1 개 있음!
>>> G 가 5 개 있음!



Counter 클래스의 함수들을 알아보자!

elements()

import collections

ex_counter = collections.Counter("I want success")
print(list(ex_counter.elements()))
print(sorted(ex_counter.elements()))    # 정렬

>>> ['I', ' ', ' ', 'w', 'a', 'n', 't', 's', 's', 's', 'u', 'c', 'c', 'e']
>>> [' ', ' ', 'I', 'a', 'c', 'c', 'e', 'n', 's', 's', 's', 't', 'u', 'w']

입력된 값의 요소를 풀어서 반환한다. 반환되는 요소는 무작위로 반환된다! 또한, 요소의 총 개수가 1보다 작을 시 반환하지 않는다.

elements()는 단순히 요소를 풀어서 출력해주며 대소문자를 구분한다!

sorted()로 오름차순 정렬을 해주었다.


most_common(n)

import collections

ex_counter = collections.Counter(['kim', 'kim', 'park', 'choi', 'kim', 'kim', 'kim', 'choi', 'park', 'choi'])
print(ex_counter.most_common())
print(ex_counter.most_common(2))
print(ex_counter.most_common(1))

>>> [('kim', 5), ('choi', 3), ('park', 2)]
>>> [('kim', 5), ('choi', 3)]
>>> [('kim', 5)]

most_common(n)함수는 입력된 값의 요소들 중 빈도수(최빈값)을 n개 반환한다. 최빈값을 반환하므로 빈도수가 높은 순으로 상위 n개를 반환하며, 결과값은 Tuple자료형이다.

most_common() 빈 값이면 요소 전체를 반환한다.
most_common(2) 최빈값 상위 2개를 반환한다.
most_common(n) 최빈값 상위 1개를 반환한다.


subtract()

import collections

ex_counter1 = collections.Counter('I love you')
ex_counter2 = collections.Counter('I love my family')
# 2번 카운터 - 1번 카운터
ex_counter2.subtract(ex_counter1)
print(ex_counter2)

>>> Counter({'m': 2, ' ': 1, 'l': 1, 'y': 1, 'f': 1, 'a': 1, 'i': 1, 'I': 0, 'v': 0, 'e': 0, 'o': -1, 'u': -1})

subtract()는 말 그대로 요소를 빼준다. 만약, 요소가 없는 경우인데 subtract()를 진행했다면 음수의 값이 반환된다.




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

덧셈 연산

import collections

ex_counter1 = collections.Counter('I love you')
ex_counter2 = collections.Counter(['I', 'l', 'o', 'v', 'e', 'h', 'e', 'r'])

print(ex_counter1)
print(ex_counter2)
print(ex_counter1 + ex_counter2)

>>> Counter({' ': 2, 'o': 2, 'I': 1, 'l': 1, 'v': 1, 'e': 1, 'y': 1, 'u': 1})
>>> Counter({'e': 2, 'I': 1, 'l': 1, 'o': 1, 'v': 1, 'h': 1, 'r': 1})
>>> Counter({'o': 3, 'e': 3, 'I': 2, ' ': 2, 'l': 2, 'v': 2, 'y': 1, 'u': 1, 'h': 1, 'r': 1})

뺄셈 연산

import collections

ex_counter1 = collections.Counter('ABCDEFGGGGG')
ex_counter2 = collections.Counter('ABCDEFG')

print(ex_counter1)
print(ex_counter2)
print(ex_counter1 - ex_counter2)

>>> Counter({'G': 5, 'A': 1, 'B': 1, 'C': 1, 'D': 1, 'E': 1, 'F': 1})
>>> Counter({'A': 1, 'B': 1, 'C': 1, 'D': 1, 'E': 1, 'F': 1, 'G': 1})
>>> Counter({'G': 4})

Counter의 뺄셈 결과값은 음수를 출력하지 않는다.


교집합(&), 합집합(|) 연산

import collections

ex_counter1 = collections.Counter('ABCDEFGGGGG')
ex_counter2 = collections.Counter('ABCDEFG')

print(ex_counter1 & ex_counter2)	# 교집합
print(ex_counter1 | ex_counter2)	# 합집합

>>> Counter({'A': 1, 'B': 1, 'C': 1, 'D': 1, 'E': 1, 'F': 1, 'G': 1})
>>> Counter({'G': 5, 'A': 1, 'B': 1, 'C': 1, 'D': 1, 'E': 1, 'F': 1})

Counter의 교집합과 합집합의 결과값은 Dictionary자료형이다. ({값 : 개수})


profile
Computer Science!!
post-custom-banner

0개의 댓글