python中deque双端队列怎么用?

穿越時空
发布: 2025-09-14 23:09:01
原创
467人浏览过
deque是Python中高效处理双端操作的队列结构,适用于频繁在两端增删元素的场景。它支持append、appendleft、pop、popleft等基本操作,时间复杂度均为O(1),性能优于list。通过maxlen参数可实现固定长度的滑动窗口,超出时自动从对端移除元素。deque不支持线程安全,多线程环境下需配合锁机制使用。适合用于实现队列、栈、缓冲区等数据结构。

python中deque双端队列怎么用?

Python的

deque
登录后复制
(双端队列)允许你高效地在队列的两端添加和移除元素。它特别适用于需要频繁进行头尾操作的场景,比如实现队列、栈或者需要快速访问两端元素的滑动窗口。
deque
登录后复制
collections
登录后复制
模块中。

使用

deque
登录后复制
,你可以轻松地进行元素的添加、删除,并且它在这些操作上的性能通常优于使用
list
登录后复制

解决方案(直接输出解决方案即可)

deque
登录后复制
的基本操作包括:

  • append(x)
    登录后复制
    : 在队列右端添加元素
    x
    登录后复制
  • appendleft(x)
    登录后复制
    : 在队列左端添加元素
    x
    登录后复制
  • pop()
    登录后复制
    : 移除并返回队列右端的元素。
  • popleft()
    登录后复制
    : 移除并返回队列左端的元素。
  • extend(iterable)
    登录后复制
    : 从队列右端添加
    iterable
    登录后复制
    中的元素。
  • extendleft(iterable)
    登录后复制
    : 从队列左端添加
    iterable
    登录后复制
    中的元素 (注意:元素顺序会反转)。
  • rotate(n)
    登录后复制
    : 将队列中的元素向右循环移动
    n
    登录后复制
    步。 如果
    n
    登录后复制
    是负数,则向左移动。
  • clear()
    登录后复制
    : 移除队列中的所有元素。
  • count(x)
    登录后复制
    : 返回队列中等于
    x
    登录后复制
    的元素个数。
  • remove(value)
    登录后复制
    : 移除队列中第一个等于
    value
    登录后复制
    的元素。 如果没有找到,则引发
    ValueError
    登录后复制
  • reverse()
    登录后复制
    : 反转队列中的元素顺序。

示例代码:

立即学习Python免费学习笔记(深入)”;

from collections import deque

# 创建一个deque
d = deque()

# 从右端添加元素
d.append(1)
d.append(2)
d.append(3)

# 从左端添加元素
d.appendleft(0)

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

# 移除右端元素
d.pop()

# 移除左端元素
d.popleft()

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

# 扩展队列
d.extend([4, 5, 6])
print(d) # deque([1, 2, 4, 5, 6])

# 从左边扩展队列 (注意顺序反转)
d.extendleft([-1, -2, -3])
print(d) # deque([-3, -2, -1, 1, 2, 4, 5, 6])

# 旋转队列
d.rotate(2)  # 向右旋转2步
print(d) # deque([5, 6, -3, -2, -1, 1, 2, 4])

d.rotate(-2) # 向左旋转2步
print(d) # deque([-3, -2, -1, 1, 2, 4, 5, 6])

# 统计元素个数
print(d.count(2)) # 1

# 移除指定元素
d.remove(2)
print(d) # deque([-3, -2, -1, 1, 4, 5, 6])

# 反转队列
d.reverse()
print(d) # deque([6, 5, 4, 1, -1, -2, -3])

# 清空队列
d.clear()
print(d) # deque([])
登录后复制

何时应该使用
deque
登录后复制
而不是
list
登录后复制

当你的主要操作涉及在序列的两端添加或删除元素时,

deque
登录后复制
通常是更好的选择。
list
登录后复制
在这些操作上的时间复杂度是O(n),因为可能需要移动其他元素。而
deque
登录后复制
在两端添加或删除元素的时间复杂度是O(1),这使得它在处理大量数据时效率更高。 但如果你需要频繁地通过索引访问元素,
list
登录后复制
通常会更快,因为
list
登录后复制
的索引访问是O(1),而
deque
登录后复制
是O(n)。

序列猴子开放平台
序列猴子开放平台

具有长序列、多模态、单模型、大数据等特点的超大规模语言模型

序列猴子开放平台 0
查看详情 序列猴子开放平台

deque
登录后复制
如何实现线程安全?

deque
登录后复制
本身不是线程安全的。这意味着如果在多个线程中同时修改同一个
deque
登录后复制
对象,可能会导致数据竞争和不确定的行为。为了在多线程环境中使用
deque
登录后复制
,你需要使用适当的同步机制,比如锁。

import threading
from collections import deque

d = deque()
lock = threading.Lock()

def add_element(element):
    with lock:
        d.append(element)
        print(f"Added {element}, current deque: {d}")

def remove_element():
    with lock:
        if d:
            element = d.popleft()
            print(f"Removed {element}, current deque: {d}")
        else:
            print("Deque is empty")

# 示例:两个线程同时添加和删除元素
t1 = threading.Thread(target=add_element, args=(1,))
t2 = threading.Thread(target=remove_element)

t1.start()
t2.start()

t1.join()
t2.join()

print("Final deque:", d)
登录后复制

在这个例子中,

threading.Lock()
登录后复制
用于确保在任何时候只有一个线程可以访问和修改
deque
登录后复制
with lock:
登录后复制
语句块会自动获取和释放锁,从而避免了手动管理锁的复杂性。

deque
登录后复制
maxlen
登录后复制
参数有什么用?

deque
登录后复制
有一个可选的
maxlen
登录后复制
参数,用于限制队列的最大长度。当
deque
登录后复制
达到最大长度时,如果继续添加元素,则会自动从另一端移除元素。这在实现固定大小的滑动窗口或缓冲区时非常有用。

from collections import deque

# 创建一个最大长度为3的deque
d = deque(maxlen=3)

d.append(1)
d.append(2)
d.append(3)

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

# 添加新元素,最左边的元素会被移除
d.append(4)
print(d)  # 输出: deque([2, 3, 4], maxlen=3)

d.appendleft(0)
print(d) # deque([0, 2, 3], maxlen=3)
登录后复制

在这个例子中,当

deque
登录后复制
达到最大长度3时,添加新元素会自动从另一端移除旧元素,从而保持队列的大小不变。

以上就是python中deque双端队列怎么用?的详细内容,更多请关注php中文网其它相关文章!

python速学教程(入门到精通)
python速学教程(入门到精通)

python怎么学习?python怎么入门?python在哪学?python怎么学才快?不用担心,这里为大家提供了python速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号