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

How to peek front of deque without popping?

我想在决定是否弹出之前检查队列前端的条件。如何在 python 中使用 collections.deque 实现此目的?

list(my_deque)[0]

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

TL;DR: 假设你的 deque 被称为 d,只需检查 d[0],因为 a 中的“最左边”元素deque 是前面的(您可能想在 deque 的长度之前进行测试以确保它不为空)。采纳@ason​​gtoruin的建议,使用if d:测试双端队列是否为空(相当于if len(d) == 0:,但更pythonic)

###为什么不转换为列表? 因为 deque 是可索引的 而你正在测试前面 。虽然 deque 具有类似于列表的接口,但实现针对前台和后台操作进行了优化。引用 documentation:

Deques support thread-safe, memory efficient appends and pops from either side of the deque with approximately the same O(1) performance in either direction.

Though list objects support similar operations, they are optimized for fast fixed-length operations and incur O(n) memory movement costs for pop(0) and insert(0, v) operations which change both the size and position of the underlying data representation.

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

Indexed access is O(1) at both ends but slows to O(n) in the middle. For fast random access, use lists instead.

转换为 list 的复杂度为 O(n),但后续每次访问的复杂度为 O(1)。

您可以使用 my_deque[-1]my_deque[len(my_deque)-1] 简单地找到最后一个元素。

这是一个简单的实现,它允许我在弹出之前检查队列的前面(使用 whileq[0]):

q.popleft() 之前对 q[0] 应用您自己的条件,如下:

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

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

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

从使用索引访问的角度来看,双端队列也可以解释为列表。 您可以使用 deque[0] 查看前面的元素,使用 deque[-1] 查看最后的元素 这可以在不从左侧或右侧弹出元素的情况下工作,而且看起来也很有效。