Deque(데크)는 Double-ended queue의 줄임말로 양방향 큐라고 볼 수 있다.
선입선출(First-in First-out) 방식으로 작동하는 queue(큐)를 양방향으로 사용할 수 있게 만들어
후입선출(Last-in First-out) 방식인 stack(스택)처럼도 사용할 수가 있다.
즉, deque는 앞 뒤 양방향에서 데이터를 넣고 뺄 수 있다.
파이썬에서 deque는 list와 유사하며, 실제로 비슷한 메소드를 가지고 있다.
하지만 list와 달리 deque은 양방향에서 데이터 처리가 가능하므로 속도가 훨씬 빠르다는 장점이 있다.
특히 deque는 시작점이나 끝점의 데이터를 넣고 빼는 데에 최적화된 연산 속도를 제공한다.
따라서 push/pop 연산이 빈번한 알고리즘에서는 list보다 deque를 사용하는 것이 훨씬 유리하다.
deque는 collections 모듈에서 불러와 사용해야 한다.
from collections import deque
deq = deque()
다음과 같이 import 한 뒤 생성하여 사용이 가능하다.
| method | 설명 |
|---|---|
| deque.append(x) | 데크의 오른쪽에 x를 추가 |
| deque.appendleft(x) | 데크의 왼쪽에 x를 추가 |
| deque.pop() | 데크의 오른쪽에서 요소를 제거하고 반환 |
| deque.popleft() | 데크의 왼쪽에서 요소를 제거하고 반환 |
| deque.insert(i, x) | 데크의 i 위치에 x를 삽입 |
| deque.remove(x) | 데크에서 x의 첫번째 항목을 제거 |
| deque.extend(iterable) | iterable 인자에서 온 요소를 추가하여 데크의 오른쪽을 확장 |
| deque.extendleft(iterable) | iterable 인자에서 온 요소를 추가하여 데크의 왼쪽을 확장 (일련의 왼쪽 추가는 iterable 인자에 있는 요소의 순서를 뒤집는 결과를 줌) |
| deque.rotate(n) | 데크를 n단계 오른쪽으로 회전, n이 음수라면 왼쪽으로 회전 (기본값은 1) |
| deque.reverse() | 데크의 요소들을 제자리에서 순서를 뒤집고 None을 반환 |
| deque.clear() | 데크에서 모든 요소를 제거하고 길이가 0인 상태로 만듬 |
| deque.copy() | 데크의 얕은 복사본을 만듬 |
| deque.count(x) | x와 같은 데크 요소의 수를 셈 |
| deque.index(x[, start[, stop]]) | 데크에 있는 x의 위치를 반환합니다 (인덱스 start 또는 그 이후, 그리고 인덱스 stop 이전) |
| deque(maxlen = n) | 데크를 생성할 때 데크의 최대크기를 n으로 제한 |
참고: 파이썬 공식문서
from collections import deque
# deque 생성
deq = deque() # []
# append
deq.append(1) # [1]
deq.append(2) # [1, 2]
deq.appendleft(3) # [3, 1, 2]
deq.appendleft(4) # [4, 3, 1, 2]
# pop
deq.pop() # [4, 3, 1]
deq.popleft() # [3, 1]
# insert
deq.insert(1, 5) # [3, 5, 1]
# remove
deq.remove(3) # [5, 1]
# extend
deq.extend([6, 7, 8]) # [5, 1, 6, 7, 8]
deq.extendleft([1, 2, 3]) # [3, 2, 1, 5, 1, 6, 7, 8]
# rotate
deq.rotate() # [8, 3, 2, 1, 5, 1, 6, 7]
deq.rotate(3) # [1, 6, 7, 8, 3, 2, 1, 5]
deq.rotate(-2) # [7, 8, 3, 2, 1, 5, 1, 6]
# reverse
deq.reverse() # [6, 1, 5, 1, 2, 3, 8, 7]
# clear
deq.clear() # []