Python中的deque详解
deque
(双端队列)是Python标准库 collections
模块中的一个重要数据结构。与列表不同,deque
提供了O(1)时间复杂度的高效插入和删除操作。本文将详细介绍 deque
的特性、使用方法以及常见操作,并举例说明其在实际应用中的优势。
deque
的基本特性
deque
是一个双端队列,支持在两端进行快速的插入和删除操作。相比于列表,deque
在以下方面具有显著优势:
- 双端操作:能够在两端高效地添加和移除元素。
- 线程安全:内置锁机制,适合在多线程环境中使用。
- 灵活性:可以指定最大长度,超过长度后会自动丢弃旧元素。
导入和创建 deque
在使用 deque
之前,需要从 collections
模块中导入:
from collections import deque
创建 deque
可以通过以下方式创建一个 deque
对象:
# 创建一个空的deque
dq = deque()
# 创建一个包含初始元素的deque
dq = deque([1, 2, 3, 4])
# 创建一个固定长度的deque
dq = deque(maxlen=5)
deque
的常见操作
添加元素
在右端添加元素
使用 append()
方法在右端添加元素:
dq = deque([1, 2, 3])
dq.append(4)
print(dq) # 输出:deque([1, 2, 3, 4])
在左端添加元素
使用 appendleft()
方法在左端添加元素:
dq = deque([1, 2, 3])
dq.appendleft(0)
print(dq) # 输出:deque([0, 1, 2, 3])
删除元素
删除右端元素
使用 pop()
方法删除右端元素:
dq = deque([1, 2, 3])
dq.pop()
print(dq) # 输出:deque([1, 2])
删除左端元素
使用 popleft()
方法删除左端元素:
dq = deque([1, 2, 3])
dq.popleft()
print(dq) # 输出:deque([2, 3])
访问和修改元素
与列表类似,可以使用索引访问和修改 deque
中的元素:
dq = deque([1, 2, 3, 4])
print(dq[1]) # 输出:2
dq[1] = 20
print(dq) # 输出:deque([1, 20, 3, 4])
旋转 deque
使用 rotate()
方法可以将 deque
中的元素向右或向左旋转:
dq = deque([1, 2, 3, 4])
dq.rotate(1)
print(dq) # 输出:deque([4, 1, 2, 3])
dq.rotate(-2)
print(dq) # 输出:deque([2, 3, 4, 1])
清空 deque
使用 clear()
方法清空所有元素:
dq = deque([1, 2, 3])
dq.clear()
print(dq) # 输出:deque([])
最大长度 deque
创建一个具有最大长度的 deque
,当达到最大长度时,旧元素将被自动丢弃:
dq = deque(maxlen=3)
dq.extend([1, 2, 3])
print(dq) # 输出:deque([1, 2, 3], maxlen=3)
dq.append(4)
print(dq) # 输出:deque([2, 3, 4], maxlen=3)
应用场景
滑动窗口
deque
适合用于实现滑动窗口,如实时计算固定长度窗口内的最大值、最小值等。
def sliding_window_max(nums, k):
dq = deque()
result = []
for i, num in enumerate(nums):
while dq and nums[dq[-1]] <= num:
dq.pop()
dq.append(i)
if dq[0] == i - k:
dq.popleft()
if i >= k - 1:
result.append(nums[dq[0]])
return result
# 示例
nums = [1, 3, -1, -3, 5, 3, 6, 7]
print(sliding_window_max(nums, 3)) # 输出:[3, 3, 5, 5, 6, 7]
队列和栈
deque
可以高效地实现队列和栈操作,适合在需要频繁插入和删除操作的场景中使用。
多线程任务队列
由于 deque
是线程安全的,可以在多线程环境中用作任务队列,避免了手动加锁的复杂性。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?