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是线程安全的,可以在多线程环境中用作任务队列,避免了手动加锁的复杂性。

posted @   晃悠人生  阅读(81)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示