在 Python 编程中,列表(list)是我们最常用的数据结构之一。但在某些场景下,比如需要频繁地从列表两端添加或删除元素时,列表的性能可能不够理想。此时,collections 模块中的 deque(双端队列)就是一个更优的选择。

本文将带你全面了解 deque 的常见用法,并通过示例代码帮助你快速上手。


一、什么是 deque?

deque 是 “double-ended queue” 的缩写,意为双端队列。它支持从队列的两端高效地添加或删除元素,时间复杂度为 O(1),而列表在头部插入/删除元素的时间复杂度为 O(n)。

from collections import deque

二、创建 deque

你可以通过传入一个可迭代对象来创建 deque

d = deque([1, 2, 3])
print(d)  # 输出: deque([1, 2, 3])

你还可以设置最大长度(maxlen),当元素超过这个长度时,最早添加的元素会被自动移除:

d = deque([1, 2, 3], maxlen=3)
d.append(4)
print(d)  # 输出: deque([2, 3, 4])

三、添加元素

方法 说明
append(x) 右侧添加元素
appendleft(x) 左侧添加元素
extend(iterable) 右侧批量添加
extendleft(iterable) 左侧批量添加(顺序会反转)
d = deque([1, 2])
d.append(3)
d.appendleft(0)
print(d)  # 输出: deque([0, 1, 2, 3])

四、删除元素

方法 说明
pop() 移除并返回右侧元素
popleft() 移除并返回左侧元素
remove(x) 移除第一个匹配的元素
d = deque([1, 2, 3])
print(d.pop())      # 输出: 3
print(d.popleft())  # 输出: 1
print(d)            # 输出: deque([2])

五、其他常用操作

方法 说明
clear() 清空队列
count(x) 统计元素 x 出现的次数
rotate(n) 向右循环移动 n 步(负数表示向左)
reverse() 原地反转(Python 3.8+)
copy() 创建浅拷贝
d = deque([1, 2, 3])
d.rotate(1)
print(d)  # 输出: deque([3, 1, 2])

六、实际应用场景

1. 实现队列(FIFO)

q = deque()
q.append('task1')
q.append('task2')
print(q.popleft())  # 输出: task1

2. 实现栈(LIFO)

stack = deque()
stack.append('A')
stack.append('B')
print(stack.pop())  # 输出: B

3. 滑动窗口(如滑动平均)

window = deque(maxlen=3)
for i in range(5):
    window.append(i)
    print(list(window), sum(window) / len(window))

七、总结

特点 描述
高效 两端操作时间复杂度为 O(1)
灵活 支持队列、栈、滑动窗口等多种结构
易用 API 简洁,功能强大

如果你在做算法题、写爬虫、做任务调度或实现缓存机制,deque 都是一个非常值得掌握的工具。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐