collections.deque:雙端隊列,支援兩端 O(1) 插入/刪除,線程安全,適合追蹤最近活動(如日誌、滑動窗口)。
import collections dq = collections.deque(maxlen=5) # 固定長度,滿時自動彈出另一端 dq = collections.deque([1,2,3]) # 從可迭代對象初始化 print(dq.maxlen) # 5 或 None
| 方法 | 說明 | 時間複雜度 |
|---|---|---|
append(x) | 右端添加 | O(1) |
appendleft(x) | 左端添加 | O(1) |
pop() | 右端彈出並返回 | O(1) |
popleft() | 左端彈出並返回 | O(1) |
extend(iterable) | 右端批量添加 | O(k) |
extendleft(iterable) | 左端批量添加(順序反轉) | O(k) |
remove(value) | 刪除第一個匹配值 | O(n) |
rotate(n) | 右旋 n 步(負數左旋) | O(min(k,n)) |
reverse() | 原地反轉 | O(n) |
clear() | 清空 | O(1) |
count(x) | 計數 x 出現次數 | O(n) |
dq = collections.deque(maxlen=5) dq.append(1); dq.append(2); dq.append(3) # deque([1,2,3], maxlen=5) dq.appendleft(0) # deque([0,1,2,3], maxlen=5) dq.extend([7,8,9]) # deque([1,2,3,7,8], maxlen=5) 滿了自動擠出左端 dq.extendleft([7,8,9]) # deque([9,8,7,1,2], maxlen=5) 注意順序反轉 dq.pop() # 8, deque([9,8,7,1], maxlen=5) dq.popleft() # 9, deque([8,7,1], maxlen=5) dq.rotate(2) # deque([7,1,8], maxlen=5) 右旋 dq.rotate(-1) # deque([1,8,7], maxlen=5) 左旋 dq.reverse() # deque([7,8,1], maxlen=5)
for x in dqdq[0], dq[-1]len(dq), reversed(dq)copy.copy(dq), copy.deepcopy(dq)in 操作符:x in dq