collections 모듈의 Counter 클래스
는 컴퓨터 과학에서의 자료구조는 아니다. 하지만, Python 언어에서 지원하는 자료구조라고 생각했기에 자료구조 시리즈에 글을 포스팅하게 되었다.
collections 모듈의 Counter 클래스
는 컨테이너안의 데이터를 편리하고 빠르게 개수를 세도록 지원하는 계수기 도구이다. (링크)
예제를 통해 Counter 클래스의 함수들을 살펴보면 훨씬 이해하기 쉬울 것이다.
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
자료형이다.
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})
>>> ['김씨', '김씨', '김씨', '김씨', '김씨', '박씨', '박씨', '최씨', '최씨', '최씨']
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 클래스
의 함수들을 알아보자!
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()
로 오름차순 정렬을 해주었다.
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개를 반환한다.
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
자료형이다. ({값 : 개수}
)