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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值