如何在不弹出的情况下查看双端队列的前面?

问题描述 投票:0回答:4

我想在决定是否弹出之前检查队列前面的条件。我怎样才能在Python中使用collections.deque来实现这一点?

list(my_deque)[0]

看起来很丑而且性能很差。

python collections deque
4个回答
60
投票

TL;DR: 假设您的

deque
称为
d
,只需检查
d[0]
,因为双端队列中的“最左边”元素是前面(您可能需要在双端队列的长度之前进行测试,以使确保它不为空)。采纳@asongtoruin的建议,使用
if d:
来测试双端队列是否为空(它相当于
if len(d) != 0:
,但更Pythonic)

为什么不转换为列表?

因为

deque
是可转位的 并且您正在测试前端。虽然
deque
具有类似于列表的界面,但其实现针对前台和后台操作进行了优化。引用文档

双端队列支持线程安全、内存高效的追加和弹出 双端队列的两侧具有大致相同的 O(1) 性能 朝任一方向。

虽然列表对象支持类似的操作,但它们针对 快速固定长度操作并产生 O(n) 内存移动成本 pop(0) 和 insert(0, v) 操作会同时更改大小和 底层数据表示的位置。

如果有大量操作访问队列的“中间”,则可能需要转换为列表。再次引用文档:

索引访问在两端都是 O(1),但在中间减慢为 O(n)。 为了快速随机访问,请使用列表。

转换为

list
的时间复杂度为 O(n),但随后的每次访问都是 O(1)。


12
投票

您可以使用

my_deque[-1]
my_deque[len(my_deque)-1]
轻松找到最后一个元素。


5
投票

这是一个简单的实现,允许我在弹出之前检查队列的前面(使用

while
q[0]
):

将您自己的条件应用于

q[0]
,在
q.popleft()
之前,如下:

testLst = [100,200,-100,400,340]
q=deque(testLst)

while q:
    print(q)
    print('{}{}'.format("length of queue: ", len(q)))
    print('{}{}'.format("head: ", q[0]))
    print()

    q.popleft()

输出

deque([100, 200, -100, 400, 340])
length of queue: 5
head: 100

deque([200, -100, 400, 340])
length of queue: 4
head: 200

deque([-100, 400, 340])
length of queue: 3
head: -100

deque([400, 340])
length of queue: 2
head: 400

deque([340])
length of queue: 1
head: 340

2
投票

假设你的双端队列是从Python集合实现的

from collections import deque
deque = deque() //syntax

Deque 也可以解释为使用索引访问的列表。 您可以使用

deque[0]
查看前面的元素,并使用
deque[-1]
查看最后一个元素 这不需要从左或右弹出元素,而且看起来也很高效。

© www.soinside.com 2019 - 2024. All rights reserved.