Python/라이브러리

파이썬(python) 라이브러리 - collections.Counter

snowman95 2021. 4. 21. 14:50
728x90
반응형

collections.Counter(iterbale)


iterbale 객체의 각 요소의 등장 횟수를 세는 기능

리스트에 음수가 있으면 안됨 !!!!!!!!!!!!!!!

import collections
a = [1,2,3,1,2,3,3,4]

b = collections.Counter(a) : 등장 횟수 많은것 부터 dict{값:등장횟수} 로 돌려줌
Counter({3: 3, 1: 2, 2: 2, 4: 1})

c = b.most_common()        : 리스트[튜플()]로 변환하여 반환
[(3, 3), (1, 2), (2, 2), (4, 1)]

d = b.elements()           : 카운터된 개수만큼 요소 반환
list(d)
[1, 1, 2, 2, 3, 3, 3, 4]

list(b)
[1, 2, 3, 4]

 

그럼 음수값이 포함된 리스트에서 등장 횟수를 어떻게 구할까?

아주 큰 수를 더하여 음수를 양수로 바꿔서 풀면 됩니다.
ex) 입력되는 정수의 절댓값은 4,000을 넘지 않는다. 
    = 모든 값에 4000을 더하면 반드시 0보다 커짐

 

2108번: 통계학

첫째 줄에 수의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 단, N은 홀수이다. 그 다음 N개의 줄에는 정수들이 주어진다. 입력되는 정수의 절댓값은 4,000을 넘지 않는다.

www.acmicpc.net

input : [-1,-1,-2,-2]
→ input에 4000씩 모두 더하고 시작

array = [3999, 3999, 3998, 3998]
print(collections.Counter(array).most_common()[0][0]-4000)
→ -1

import numpy np (백준에서는 지원 안됩니다)
print(np.bincount(array).argmax()-4000)
→ -2

Q. numpy의 경우에는 왜 이런 결과가 나올까?
bincount()는 0부터 가장큰 값 까지 등장횟수 순서대로 나열
argmax() 함수는 array에서 가장 큰 값 들고오는데 여러개 있으면 가장 처음 만나는 것 들고옴 
그래서 3999이 아니라 3998 값을 가져옴.
3998-4000 = -2

 

반복문을 사용하지 않고 각 요소를 원하는 개수만큼 리스트로 생성

import collections
mycounter = collections.Counter (a = 1, b = 2, c = 3) 
print(list(mycounter.elements()))

['a', 'b', 'b', 'c', 'c', 'c']
import collections
map_arr = {'a':1, 'b':2, 'c':3}
mycounter = collections.Counter (map_arr) 
print(list(mycounter.elements()))

['a', 'b', 'b', 'c', 'c', 'c']

 

 

문자열에 a~z가 각각 몇 개 등장하는지 카운트

 

10808번: 알파벳 개수

단어에 포함되어 있는 a의 개수, b의 개수, …, z의 개수를 공백으로 구분해서 출력한다.

www.acmicpc.net

import sys,collections,string
s = sys.stdin.readline().rstrip()
arr = {}
for i in string.ascii_lowercase:
    arr[i] = 0
for key,value in dict(collections.Counter(s)).items():
    arr[key] = value
for i in string.ascii_lowercase:
    sys.stdout.write(str(arr[i]) + ' ')
반응형