如何偷看德克的正面而不弹出?



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

list(my_deque)[0]

看起来很丑,性能很差。

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

为什么不转换为列表?

因为deque是可索引的,而且您正在测试前端。虽然deque具有类似于列表的接口,但该实现针对前端和后端操作进行了优化。引用文档:

Deques 支持线程安全、内存高效的追加和弹出 二面的任一侧具有大致相同的 O(1) 性能 在任一方向。

尽管列表对象支持类似的操作,但它们针对 快速固定长度操作,并产生 O(n) 内存移动成本 pop(0) 和 insert(0, v) 操作,可更改大小和 基础数据表示形式的位置。

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

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

转换为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

假设你的deque是从集合python实现

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

Deque 也可以解释为使用索引访问的列表。 您可以使用deque[0]查看前部元素,并使用deque[-1]这无需从左侧或右侧弹出元素即可工作,并且看起来也很有效。

最新更新