Python

[Python] 파이썬 모듈 collections의 deque 덱 큐 사용법

yujinius 2024. 4. 14. 16:43

deque 덱(double-ended queue)

  • 양쪽 끝에서 데이터의 처리(삽입, 삭제)가 가능한 양방향 자료형
  • 두 개의 포인터를 사용하여, 양쪽에서 삭제와 삽입 가능
  • 큐와 스택을 합친 형태라고도 생각할 수 있음
  • 스택(stack)처럼 써도 되고 큐(queue)처럼 써도 된다.

파이썬에서 collections.deque

  • 파이썬에서의 collections 모듈의 deque는 리스트와 비슷하다.
  • 아래와 같이 불러올 수 있다.
from collections import deque

deque를 리스트 대신 사용하면 얻는 가장 큰 장점!

  • pop(0)과 같은 메서드를 수행할 때 리스트라면 O(N)의 연산을 수행하지만, deque는 O(1)의 연산을 수행한다.
  • 이외에 스레드 환경에서 안전하다는 장점도 있다. deque 함수 목록

파이썬 deque 함수 목록

함수 목록은 아래와 같이 있다

  1. append(x): deque의 오른쪽 끝에 요소 x를 추가합니다.
  2. appendleft(x): deque의 왼쪽 끝에 요소 x를 추가합니다.
  3. clear(): deque의 모든 요소를 제거합니다.
  4. copy(): deque의 얕은 복사본을 반환합니다.
  5. count(x): deque에서 값이 x인 요소의 개수를 반환합니다.
  6. extend(iterable): iterable의 모든 요소를 deque의 오른쪽 끝에 추가합니다.
  7. extendleft(iterable): iterable의 모든 요소를 deque의 왼쪽 끝에 추가합니다.
  8. index(x, start, stop): deque에서 값이 x인 첫 번째 요소의 인덱스를 반환합니다. startstop 인덱스를 지정하여 검색 범위를 제한할 수 있습니다.
  9. insert(i, x): deque의 인덱스 i에 요소 x를 삽입합니다.
  10. maxlen: deque의 최대 길이(최대 요소 수)를 나타내는 읽기 전용 속성입니다.
  11. pop(): deque의 오른쪽 끝에서 요소를 제거하고 반환합니다.
  12. popleft(): deque의 왼쪽 끝에서 요소를 제거하고 반환합니다.
  13. remove(value): deque에서 값이 value인 첫 번째 요소를 제거합니다.
  14. reverse(): deque의 요소를 역순으로 뒤집습니다.
  15. rotate(n): deque를 n단계만큼 오른쪽으로(양수 n) 또는 왼쪽으로(음수 n) 회전합니다. 회전은 요소의 위치를 변경하지만 요소는 변하지 않습니다.

파이썬 deque 함수 예제

from collections import deque

# deque 생성
my_deque = deque()

# append 함수: deque의 오른쪽 끝에 요소를 추가합니다.
my_deque.append(1)
my_deque.append(2)
my_deque.append(3)
print("요소 추가 후 deque:", my_deque)  
# 출력 결과: 요소 추가 후 deque: deque([1, 2, 3])

# appendleft 함수: deque의 왼쪽 끝에 요소를 추가합니다.
my_deque.appendleft(0)
print("왼쪽에 요소 추가 후 deque:", my_deque)  
# 출력 결과: 왼쪽에 요소 추가 후 deque: deque([0, 1, 2, 3])

# pop 함수: deque의 오른쪽 끝에서 요소를 빼고 반환합니다.
popped_element = my_deque.pop()
print("오른쪽 끝에서 뺀 요소:", popped_element)  
# 출력 결과: 오른쪽 끝에서 뺀 요소: 3
print("오른쪽 끝에서 빼고 난 후 deque:", my_deque)  
# 출력 결과: 오른쪽 끝에서 빼고 난 후 deque: deque([0, 1, 2])

# popleft 함수: deque의 왼쪽 끝에서 요소를 빼고 반환합니다.
popped_left_element = my_deque.popleft()
print("왼쪽 끝에서 뺀 요소:", popped_left_element)  
# 출력 결과: 왼쪽 끝에서 뺀 요소: 0
print("왼쪽 끝에서 빼고 난 후 deque:", my_deque)  
# 출력 결과: 왼쪽 끝에서 빼고 난 후 deque: deque([1, 2])

# extend 함수: iterable의 요소를 deque의 오른쪽 끝에 추가합니다.
my_deque.extend([4, 5, 6])
print("오른쪽 끝에 iterable 요소 추가 후 deque:", my_deque)  
# 출력 결과: 오른쪽 끝에 iterable 요소 추가 후 deque: deque([1, 2, 4, 5, 6])

# extendleft 함수: iterable의 요소를 deque의 왼쪽 끝에 추가합니다.
my_deque.extendleft([-1, -2, -3])
print("왼쪽 끝에 iterable 요소 추가 후 deque:", my_deque)  
# 출력 결과: 왼쪽 끝에 iterable 요소 추가 후 deque: deque([-3, -2, -1, 1, 2, 4, 5, 6])

# remove 함수: deque에서 첫 번째로 나오는 특정 값을 제거합니다.
my_deque.remove(3)
print("3을 제거한 후 deque:", my_deque)  
# 출력 결과: 3을 제거한 후 deque: deque([-3, -2, -1, 1, 2, 4, 5, 6])

# rotate 함수: deque를 n단계만큼 오른쪽으로(양수 n) 또는 왼쪽으로(음수 n) 회전합니다.
my_deque.rotate(2)
print("오른쪽으로 2번 회전 후 deque:", my_deque)  
# 출력 결과: 오른쪽으로 2번 회전 후 deque: deque([5, 6, -3, -2, -1, 1, 2, 4])

my_deque.rotate(-3)
print("왼쪽으로 3번 회전 후 deque:", my_deque)  
# 출력 결과: 왼쪽으로 3번 회전 후 deque: deque([-2, -1, 1, 2, 4, 5, 6, -3])

# clear 함수: deque의 모든 요소를 제거합니다.
my_deque.clear()
print("모든 요소를 제거한 후 deque:", my_deque)  
# 출력 결과: 모든 요소를 제거한 후 deque: deque([])

위의 예제에서 사용한 함수들은 다음과 같다.

  1. append(x): deque의 오른쪽 끝에 요소 x를 추가합니다.
  2. appendleft(x): deque의 왼쪽 끝에 요소 x를 추가합니다.
  3. pop(): deque의 오른쪽 끝에서 요소를 제거하고 반환합니다.
  4. popleft(): deque의 왼쪽 끝에서 요소를 제거하고 반환합니다.
  5. extend(iterable): iterable의 요소를 deque의 오른쪽 끝에 추가합니다.
  6. extendleft(iterable): iterable의 요소를 deque의 왼쪽 끝에 추가합니다.
  7. remove(value): deque에서 첫 번째로 나오는 특정 값을 제거합니다.
  8. rotate(n): deque를 n단계만큼 오른쪽으로(양수 n) 또는 왼쪽으로(음수 n) 회전합니다.
  9. clear(): deque의 모든 요소를 제거합니다.