데이터 처리를 위한 유용한 자료구조를 포함하고 있는 라이브러리이다.
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/