
데이터 처리를 위한 유용한 자료구조를 포함하고 있는 라이브러리이다.
collections 라이브러리는 Counter, deque, defaultDict, namedtuple(), ChainMap 등 다양한 클래스를 제공하지만, 주로 사용하는 Counter, deque, defaultDict에 대해서만 정리하려고 한다.
등장 횟수를 세는 기능을 제공한다. 해시 가능한 객체를 세기 위한
dict서브 클래스이다.
iterable 객체가 주어졌을 때, 해당 객체 내부의 원소가 몇 번씩 등장했는지를 알려준다.iterable로부터 계산되거나 다른 매핑(또는 계수기)에서 초기화된다.c = Counter() # 새로운, 비어 있는 counter
c = Counter('lemon') # 하나의 iterable
KeyError를 발생시키는 대신 0을 반환한다.c = Counter('green', 'blue')
print(c['red']) # 0
0으로 설정해도 계수기에서 요소가 제거되지 않기 때문에 완전히 제거하려면 del을 사용해야 한다.c['orange'] = 0 # counter entry with a zero counter
del c['orange'] #
| method | 설명 |
|---|---|
| elements() | 개수만큼 반복되는 요소에 대한 iterator 반환한다. 요소의 개수가 1보다 작으면 무시한다. |
| most_common([n]) | n개의 가장 많이 등장한 요소와 그 개수를 많이 등장한 순서대로 나열한 리스트 반환한다. |
| subtract([iterable-or-mapping]) | iterable이나 다른 매핑으로부터 온 요소들을 뺀다. |
from collections import Counter
c = Counter(a=4, b=2, c=0, d=2)
print(sorted(c.elements()))
most = Counter(c).most_common(1)
print(f"가장 많이 등장한 원소는 {most[0][0]}로, 총 {most[0][1]}번 등장하였다.")
d = Counter(a=1, b=2, c=3, d=4)
c.subtract(d)
print(c)
['a', 'a', 'a', 'a', 'b', 'b', 'd', 'd']
가장 많이 등장한 원소는 a로, 총 4번 등장하였다.
Counter({'a': 3, 'b': 0, 'd': -2, 'c': -3})
큐의 맨 앞과 끝에 데이터를 추가/삭제하여 데이터 수와 관계없이 일정한 속도로 수행한다.

rear, front 모두 삽입/삭제가 가능한 자료구조deque는 스택이나 큐의 기능을 모두 포함하고 있기 때문에 보통 python에서는 deque를 이용하여 큐를 구현하며, 스택의 대용으로도 사용될 수 있다.| method | 설명 |
|---|---|
| append(x) | deque의 오른쪽에 x 추가 |
| appendleft(x) | deque의 왼쪽에 x 추가 |
| clear() | deque의 모든 요소 제거 & 길이가 0인 상태로 변경 |
| copy() | deque의 얕은 복사본 생성 |
| count(x) | x와 같은 deque 요소 카운트 |
| extend(iterable) | iterable 인자에서 온 요소를 추가해서 deque의 오른쪽 확장 |
| extendleft(iterable) | iterable 인자에서 온 요소를 추가해서 deque의 왼쪽 확장 |
| index(x)[, start[, stop]]) | deque에 있는 x 위치 반환. 찾지 못하면 ValueError 발생 |
| insert(i, x) | x를 deque의 i 위치에 삽입 |
| pop() | deque의 오른쪽에서 요소 제거 후 반환. 요소가 없으면 IndexError 발생 |
| popleft() | deque의 왼쪽에서 요소 제거 후 반환. 요소가 없으면 IndexError 발생 |
| remove(value) | value의 첫 번째 항목 제거. 찾을 수 없으면 ValueError 발생 |
| reverse() | deque의 요소를 제자리에서 순서를 뒤집고 None 반환 |
| rotate(n=1) | n이 양수이면 오른쪽, 음수이면 왼쪽으로 회전 |
from collections import deque
queue = deque()
# 요소 삽입
queue.append(1)
queue.appendleft(2)
queue.extend([3, 4])
queue.extendleft([5, 6])
queue.insert(7, 7)
print(queue)
print()
# 요소 삭제
print("오른쪽에서 요소 삭제:", queue.pop())
print("왼쪽에서 요소 삭제:", queue.popleft())
print(queue)
print()
# 기타
queue.rotate()
print("queue 오른쪽으로 회전:", queue)
deque([6, 5, 2, 1, 3, 4, 7])
오른쪽에서 요소 삭제: 7
왼쪽에서 요소 삭제: 6
deque([5, 2, 1, 3, 4])
queue 오른쪽으로 회전: deque([4, 5, 2, 1, 3])
등록되어 있지 않은 키를 호출해도
KeyError가 발생하지 않고, 지정된 기본값을 반환한다.
dictionary의 하위 클래스이다.defaultdict(default_factory)에서 default_factory는 생성된 dictionary에 대한 기본값을 제공하는 함수로, default_facotory를 지정하지 않으면 KeyError가 발생한다. default_factory를 int로 지정하면 키 값에 대해 기본값 0을 지정하며, 카운팅할 때 유용하게 사용할 수 있다.defaultdict을 사용하지 않고 기본 dict을 사용한다면 다음과 같이 코드를 작성해야 할 것이다. fruits_dict = dict()
supermarket = ["grape", "apple", "banana", "grape", "apple", "lemon", "watermelon", "strawberry", "lemon", "strawberry",
"banana", "banana", "grape", "apple", "lemon", "lemon"]
for s in supermarket:
# s라는 키 값이 fruits_dict에 있는지 확인 과정이 필요함
if s not in fruits_dict:
fruits_dict[s] = 1
else:
fruits_dict[s] += 1
print(fruits_dict) # {'grape': 3, 'apple': 3, 'banana': 3, 'lemon': 4, 'watermelon': 1, 'strawberry': 2}
defaultdict을 사용하면 if문을 사용하여 키 값이 존재하는지 확인하는 과정이 필요없어서 더욱 간편하게 사용할 수 있다.from collections import defaultdict
fruits_dict = defaultdict(int)
supermarket = ["grape", "apple", "banana", "grape", "apple", "lemon", "watermelon", "strawberry", "lemon", "strawberry",
"banana", "banana", "grape", "apple", "lemon", "lemon"]
for s in supermarket:
fruits_dict[s] += 1
print(fruits_dict) # defaultdict(<class 'int'>, {'grape': 3, 'apple': 3, 'banana': 3, 'lemon': 4, 'watermelon': 1, 'strawberry': 2})
이것이 취업을 위한 코딩테스트다 with 파이썬
https://docs.python.org/ko/3/library/collections.html
https://sup2is.github.io/2019/09/23/array-deque.html
https://kimdoky.github.io/python/2019/11/25/python-collections/