공부/파이썬

[파이썬] Collections 모듈 < import collections >

snn.il 2021. 8. 26. 00:16

[Collections 모듈]

- deque

deque(데크)는 double-ended queue의 줄임말로 양방향에서 데이터를 처리할 수 있는 queue형 자료구조를 의미한다.

그렇다면 deque는 도대체 왜? 언제? 쓰는 것일까?

deque는 스택이나 큐를 사용할 때 이용하면 일반적인 리스트보다 빠른 연산 속도를 제공한다. 즉, 시작점의 값을 넣고 빼거나, 끝 점의 값을 넣고 빼는 데 최적화된 연산 속도를 제공한다는 뜻이다. 리스트에서 push나 pop을 자주 사용해야 하는 문제가 있다면 deque를 사용하는 것을 적극 추천한다.

 

[deque의 method들]

더보기

append(x) 데크의 오른쪽에 x를 추가

 

appendleft(x) 데크의 왼쪽에 x를 추가

 

extend(iterable) iterable 인자에서 온 요소를 추가하여 데크의 오른쪽을 확장

 

extendleft(iterable) iterable에서 온 요소를 추가하여 데크의 왼쪽을 확장

 

index(x[, start[, stop]]) 데크에 있는 x의 위치를 반환 (인덱스 start 또는 그 이후, 그리고 인덱스 stop 이전)

 

insert(i, x) x를 데크의 i 위치에 삽입

 

pop() 데크의 오른쪽에서 요소를 제거하고 반환, 요소가 없으면 IndexError를 발생

 

popleft() 데크의 왼쪽에서 요소를 제거하고 반환합, 요소가 없으면 IndexError를 발생

 

remove(value) value의 첫 번째 항목을 제거, 찾을 수 없으면 ValueError를 발생

 

reversed() 데크의 요소들을 순서를 역순으로 뒤집기

 

rotate(n=1) 데크를 n 단계 오른쪽으로 회전, n이 음수이면 왼쪽으로 회전 (linked list의 동작)

 

maxlen 데크의 최대 길이 지정

from collections import deque

# A를 deque로 설정
A = deque([1,2,3,4])

# A의 맨 첫번째값(맨 왼쪽)을 pop
print(A.popleft()) # 1

# A의 맨 첫번째값에 0 추가
A.appendleft(0)
print(A) # 0,2,3,4

# A를 오른쪽으로 한칸씩 이동 (링크드 리스트 원리)
A.rotate(1)
print(A) # 4,0,2,3

 

- Counter

컨테이너 값의 동일한 객체가 몇개인지 파악할 때 쓰이고 list를 dict로 만들어 갯수를 센다. 또한, Counter에서 유심히 볼 부분은 dict끼리의 뺄셈, 덧셈을 가능하게 해준다는 것이다.

[Counter의 method들]

더보기

elements() dict의 요소를 iter로 풀어서 보여줌

 

most_common(요소값중 비중이 가장 높은 순으로 반환한다, 값을 입력하면 입력된 값의 빈도수 만 반환한다

 

subtract(입력된 dict의 요소만큼 빼서 값을 보여준다 # '-' 와는 살짝 다름, 코드에서 확인

 

update() 입력된 dict의 요소만큼 더해서 값을 보여준다 # '+'와는 살짝 다름, 코드에서 확인

from collections import Counter
A = Counter(a=1,b=2,c=3,d=4)
B = Counter(['a','a','b','b','c','c','d','d'])

sorted(A.elements()) #A를 리스트로 다시풀어서 보여줌 
# -> ['a', 'b', 'b', 'c', 'c', 'c', 'd', 'd', 'd', 'd']

A-B # 빼고 0이하의 값은 버림
# -> Counter({'d': 2, 'c': 1})
A.subtract(B) # A - B 를 한다음 A에 값을 저장 (0이하의 값도 유지)
# -> Counter({'d': 2, 'c': 1, 'b': 0, 'a': -1})

A+B
# -> Counter({'d': 6, 'c': 5, 'b': 4, 'a': 3})
A.update(B) # A + B 를 한다음 값을 저장
# -> Counter({'d': 6, 'c': 5, 'b': 4, 'a': 3})

A.most_common() #값이 제일 높은순서로 tuple형식으로 보여줌
#->[('d', 4), ('c', 3), ('b', 2), ('a', 1)]

 

- defaultdict 

dict의 서브클래스, dict와 작동하는 방식은 거의 동일하지만 인자로 주어진 객체의 기본값을 딕셔너리값의 초깃값으로 지정할 수 있다.

int, list, set 등으로 초기화 할 수 있기 때문에 여러 용도로 사용 가능, dict와 다르게 키가 없는 요소를 불러와도 에러가 나지 않음

from collections import defaultdict
A = defaultdict(int) # int형 dict
A
# -> defaultdict(<class 'int'>, {})
A['a'] # 원래 dict같은 경우였으면 Error이지만, defaultdict같은 경우 0값을 초기값으로 설정해줌
A
# -> defaultdict(<class 'int'>, {'a': 0})
# ------------------------------------------------------
A = defaultdict(int) # int형 dict
char = 'a'
for i in ['a','b','c','d','a','a']:
    if char == i :
        A[char]+= 1 #초깃값을 0으로 주기때문에 가능
        
print(A)
# -> defaultdict(<class 'int'>, {'a': 3})

 

이렇게 여러 유용한 툴들을 알고 있으면 직접 개발하는데도 도움이 되고, 코딩테스트 시에도 도움이 된다. 이러한 툴들은 코드를 줄여주는 역할도 할 뿐만아니라 시간 복잡도도 줄여준다는 확실한 이점이 있다. 

'공부 > 파이썬' 카테고리의 다른 글

[파이썬] heapq 모듈 < import heapq >  (0) 2021.08.30