최근에 푼 알고리즘 문제에서 다른 사람은 collections를 이용해서 간단하게 푼 걸 보고 나중에 나도 써먹어야겠다 싶었다. 쓸 때마다 까먹어서 이번에 간단하게라도 정리해봐야겠다.
위에서 말한 알고리즘 문제 (프로그래머스 - 메뉴 리뉴얼)
https://programmers.co.kr/learn/courses/30/lessons/72411
a에서 요소들의 개수를 세서, 딕셔너리
형태로 반환
import collections
arr = ['python', 'velog', 'java', 'velog', 'velog', 'python']
print(collections.Counter(arr))
>>> Counter({'velog': 3, 'python': 2, 'java': 1})
개수가 많은 것부터 내림차순으로 출력한다.
a가 문자열
일 때도 가능하다.
import collections
a = 'VELOGVELOGVEL'
print(collections.Counter(a))
>>> Counter({'V': 3, 'E': 3, 'L': 3, 'O': 2, 'G': 2})
딕셔너리 함수도 사용할 수 있다.
ex) keys(), values(), items()
import collections
arr = collections.Counter(['python', 'velog', 'java', 'velog', 'velog', 'python'])
print(arr.keys())
print(arr.values())
for key, value in arr.items():
print(key, ':', value, '개')
>>> python : 2 개
>>> velog : 3 개
>>> java : 1 개
>>> dict_keys(['python', 'velog', 'java'])
>>> dict_values([2, 3, 1])
counter 함수로 구한 딕셔너리 값끼리 연산 가능!
( +, -, & (교집합), | (합집합)이 가능하다)
import collections
arr1 = [1,2,3,4,3,3]
arr2 = [0,1,2,2,3,3]
print(collections.Counter(arr1))
print(collections.Counter(arr2))
print(collections.Counter(arr1) + collections.Counter(arr2))
print(collections.Counter(arr1) - collections.Counter(arr2))
print(collections.Counter(arr1) & collections.Counter(arr2))
print(collections.Counter(arr1) | collections.Counter(arr2))
# 출력 결과
>>> Counter({3: 3, 1: 1, 2: 1, 4: 1})
>>> Counter({2: 2, 3: 2, 0: 1, 1: 1})
>>> Counter({3: 5, 2: 3, 1: 2, 4: 1, 0: 1}) // 덧셈
>>> Counter({3: 1, 4: 1}) // 뺄셈
>>> Counter({3: 2, 1: 1, 2: 1}) // 교집합
>>> Counter({3: 3, 2: 2, 1: 1, 4: 1, 0: 1}) // 합집합
뺄셈 결과에서 음수 값은 반환하지 않는다.
collections.Counter.(arr).most_common(n)
: arr의 요소 중, 최빈값 n개를 반환 (리스트 안의 튜플 형태)
most_common()
(n이 None
이면) arr의 요소 모두 반환
most_common(2)
arr의 요소 중 최빈값 2개 반환
import collections
arr = ['python', 'velog', 'java', 'velog', 'velog', 'python']
print(collections.Counter(arr).most_common(2))
>>> [('velog', 3), ('python', 2)]
요소를 빼준다. 위의 뺄셈과 다르게 음수값도 반환된다.
import collections
arr1 = collections.Counter('ABCDEFGHIJ')
arr2 = collections.Counter('AAABBBCCCDEFF')
arr2.subtract(arr1) // 2번째 - 1번째
print(arr2)
>>> Counter({'A': 2, 'B': 2, 'C': 2, 'F': 1, 'D': 0, 'E': 0, 'G': -1, 'H': -1, 'I': -1, 'J': -1})