[Python] collections 라이브러리

mmy789·2022년 5월 22일
0

Python

목록 보기
6/6
post-thumbnail

[ collections 라이브러리 ]

데이터 처리를 위한 유용한 자료구조를 포함하고 있는 라이브러리이다.

collections 라이브러리는 Counter, deque, defaultDict, namedtuple(), ChainMap 등 다양한 클래스를 제공하지만, 주로 사용하는 Counter, deque, defaultDict에 대해서만 정리하려고 한다.


[ Counter ]

등장 횟수를 세는 기능을 제공한다. 해시 가능한 객체를 세기 위한 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})

[ deque ]

큐의 맨 앞과 끝에 데이터를 추가/삭제하여 데이터 수와 관계없이 일정한 속도로 수행한다.

  • 양방향으로 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])

[ defaultdict ]

등록되어 있지 않은 키를 호출해도 KeyError가 발생하지 않고, 지정된 기본값을 반환한다.

  • dictionary의 하위 클래스이다.
  • defaultdict(default_factory)에서 default_factory는 생성된 dictionary에 대한 기본값을 제공하는 함수로, default_facotory를 지정하지 않으면 KeyError가 발생한다.
    • default_factoryint로 지정하면 키 값에 대해 기본값 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/

profile
Backend Developer

0개의 댓글