Counter 클래스는 한 객체 안에 요소가 몇 개 들어있는지 세어주는 편리함을 제공한다.
Counter를 사용한 알고리즘
[Baekjoon] 10816. 숫자카드2
[Programmers] 귤 고르기
collections모듈의 Counter 클래스는 별도 패키지 없이 import해서 사용할 수 있다.
from collections import Counter
Counter 생성자는 여러 형태의 데이터를 인자로 받는다.
중복된 데이터가 저장된 배열을 인자로 넘기면 각 원소가 몇 번씩 나오는지가 저장된 객체를 얻게 된다.
ex_list = ['kim', 'kim', 'park', 'choi', 'kim', 'kim', 'kim', 'choi', 'park', 'choi']
ex_counter = Counter(ex_list)
print(ex_counter)
print(type(ex_counter))
# 출력
Counter({'kim': 5, 'choi': 3, 'park': 2})
<class 'collections.Counter'>
시간복잡도
Counter 클래스는 입력값을 순회하면서 연산을 수행하므로 N개의 원소를 가진 리스트를 한 번 순회하면서 Counter 객체를 구성하는 데 O(N) 시간이 걸린다.
key와 value 출력하기
# ex_counter = Counter({'kim': 5, 'choi': 3, 'park': 2})
for i in ex_counter:
print(i, end=" ")
#출력
kim park choi
for i in ex_counter:
print(ex_counter[i], end=" ")
#출력
5 2 3
요소가 많은 순서대로 출력되지는 않는다. 순서대로 출력하기 위해서는 most_common()또는 sorted()의 key를 설정하는 방법을 이용한다.
counter.most_common()
x = Counter({'a':3, 'b':7, 'c':1})
x = x.most_common()
print(x)
# [('b', 7), ('a', 3), ('c', 1)]
가장 빈도가 많은 요소 확인하기
x.most_common(1)
# [('b', 7)]
sorted의 key 이용하기 - lambda
x.items()를 가져와 각 item(key, value)의 value를 기준으로 정렬한다.
x = Counter({'a':3, 'b':7, 'c':1})
x = sorted(x.items(), key = lambda i : i[1], reverse=True )
print(x)
# [('b', 7), ('a', 3), ('c', 1)]