Python中的deque详解
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是线程安全的,可以在多线程环境中用作任务队列,避免了手动加锁的复杂性。
浙公网安备 33010602011771号