파이썬 문법

파이썬 내장 모듈 Collections

토리쟁이 2023. 11. 20. 17:12

 

  • collections
    • 파이썬의 자료형들에게 확장된 기능을 제공하기 위해 만들어진 파이썬 내장 모듈
    • 자료구조와 달리, 데이터를 서로 연관시키지 않고 그냥 모아두는 컨테이너
    • 자주 쓰이는 클래스들 Counter, deque, defaultdict → 아래에서 자세하게 정리
    • 그 외 OrderedDict(딕셔너리 정렬), namedtuple, ChainMap 등이 있음

 

 

  • Counter
    • iterable한 객체의 개수를 셀 때 사용하는 클래스
    • {element1:개수, element2:개수, ..} 와 같은 딕셔너리 형태로 저장
    • 개수가 가장 많은 순으로 정렬되어 나옴(단, 같은 갯수인 경우엔 먼저 등장한 순으로-)
    • 생성시 시간 복잡도: O(n)
    • 원하는 element가 없을 경우에도 KeyError 발생x, 0 반환
    • key를 제거하고 싶은 경우, del 사용
    • elements(): 개수만큼 반복되는 key에 대한 iterator를 반환(단, 0개인 경우는 무시됨)
    • most_common(n): 가장 빈도가 높은 순으로 n개 반환(n이 없을 경우, 모든 것을 내림차순으로-)
    • tatal(): 전체 개수(모든 value의 합)을 계산하여 반환(파이썬 3.10부터 지원)
from collections import Counter
# iterable하면 모두 가능
cnt1 = Counter('bacdefgaabbc')  #Counter({'a': 3, 'b': 3, 'c': 2, 'd': 1, 'e': 1, 'f': 1, 'g': 1}
cnt2 = Counter(['x', 'z', 'y', 'z', 'm', 'x', 'z'])  #Counter({'z': 3, 'x': 2, 'y': 1, 'm': 1})
cnt3 = Counter(x=5, y=3)  #Counter({'x': 5, 'y': 3})

c4 = Counter(d=2, a=3, c=0, b=2)
print(list(c4.elements()))  #['d', 'd', 'a', 'a', 'a', 'b', 'b']
print(c4.most_common(2))  #[('a', 3), ('d', 2)]
print(c4.total())  #7(파이썬 3.10부터 지원됨)

 

 

 

 

 

deque

  • deque(데크)
    • double-ended queue의 줄임말 → 양방향에서 데이터를 처리할 수 있는 queue형 자료구조
    • append(x): deque의 오른쪽(마지막)에 x를 추가
    • appendleft(x): deque의 왼쪽(처음)에 x를 추가
    • extend(iterable x): iterable한 각 요소 x를 deque의 오른쪽(마지막)에 추가 (append와 다름!)
    • extendleft(iterable x): iterable한 각 요소 x를 deque의 왼쪽(처음)에 추가
    • pop(): deque의 오른쪽(마지막)에 있는 원소를 제거 및 반환
    • popleft(): deque의 왼쪽(처음)에 있는 원소를 제거 및 반환
    • rotate(n): n이 양수인 경우 n만큼 오른쪽으로 회전 / 음수인 경우 왼쪽으로 회전
from collections import deque

deq = deque(['a', 'b', 'c'])
deq.append('d')  #deque(['a', 'b', 'c', 'd'])
deq.appendleft('start')  #deque(['start', 'a', 'b', 'c', 'd'])
deq.extend('end')  #deque(['start', 'a', 'b', 'c', 'd', 'e', 'n', 'd'])
deq.extendleft('go')  #deque(['o', 'g', 'start', 'a', 'b', 'c', 'd', 'e', 'n', 'd'])
deq.pop()  #deque(['o', 'g', 'start', 'a', 'b', 'c', 'd', 'e', 'n'])
deq.popleft()  #deque(['g', 'start', 'a', 'b', 'c', 'd', 'e', 'n'])
deq.rotate(2)  #deque(['e', 'n', 'g', 'start', 'a', 'b', 'c', 'd'])
deq.rotate(-5)  #deque(['b', 'c', 'd', 'e', 'n', 'g', 'start', 'a'])

 

 

  • defaultdict 
    • key의 값(value)에 초깃값을 지정하여 딕셔너리를 생성
    • 즉, key의 값(value)이 없을 경우, 미리 지정해 놓은 초기값(default)을 반환하는 dictionary
    • 기본 딕셔너리는 해당 키가 없을 경우, KeyError Exception 에러가 발생하지만, defaultdict는 에러 발생x → 초기값을 반환
origin_dict = {'a':3, 'b':1, 'c':2}
print(origin_dict['e'])  #KeyError: 'e'

default_dict = defaultdict(int, a=3, b=2, c=2)  #int로 초기화 -> 0
print(default_dict['e'])  #0
default_dict = defaultdict(list, 바나나='원숭이')  #list로 초기화 -> []
print(default_dict['사과'])  #[]