如何在没有弹出的情况下偷看前方?

时间:2018-02-06 10:02:02

标签: python collections deque

我想在决定是否弹出之前检查队列前面的条件。如何在collect.deque?#/ p>的python中实现这一点

list(my_deque)[0]

看起来很难看并且表现不佳。

4 个答案:

答案 0 :(得分:8)

TL; DR:假设deque被称为d,只需检查d[-1],因为"最右边"双端队列中的元素是前面的(您可能希望在双端队列长度之前进行测试,以确保它不是空的)。采用@ asongtoruin的建议,使用if d:来测试双端队列是否为空(它等同于if len(d) == 0:,但更多是pythonic)

为什么不转换为列表?

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

  

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

     

虽然列表对象支持类似的操作,但它们已经过优化   快速固定长度操作并导致O(n)内存移动成本   pop(0)和insert(0,v)操作,它们改变了大小和   基础数据表示的位置。

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

  

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

转换为list为O(n),但每次后续访问都为O(1)。

答案 1 :(得分:1)

这是一个简单的实现,允许我在弹出之前检查队列的开头(使用whileq[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 :(得分:0)

您只需使用my_deque[-1]my_deque[len(my_deque)-1]找到最后一个元素。

答案 3 :(得分:0)

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

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

Deque 也可以解释为使用索引访问的列表。 您可以使用 deque[0] 查看前面的元素,使用 deque[-1] 查看最后一个元素 这不需要从左或右弹出元素,而且看起来也很有效。