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

JSS*_*all 14 python collections deque

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

list(my_deque)[0]
Run Code Online (Sandbox Code Playgroud)

表现难看,表现不佳.

sur*_*egi 16

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


GPh*_*ilo 14

TL; DR:假设你deque被调用d,只需检查d[-1],因为双端队列中的"最右边"元素是前面的(你可能想要在双端队列长度之前测试以确保它不是空的).考虑@ asongtoruin的建议,if d:用来测试双端队列是否为空(它相当于if len(d) == 0:,但更加pythonic)

为什么不转换成列表?

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

Deques支持线程安全,内存有效的附加和从双端队列的弹出,在任一方向上具有大致相同的O(1)性能.

尽管列表对象支持类似的操作,但它们针对快速固定长度操作进行了优化,并导致pop(0)和insert(0,v)操作的O(n)内存移动成本,这些操作改变了底层数据表示的大小和位置.

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

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

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

  • 您应该能够直接检查双端队列是否为空而无需检查其长度(即`if d:` 而不是`if len(d) > 0:`) (3认同)
  • 我找了一个副本,但找不到一个.你有我的紫外线!你可以补充一点,转换为`list`不仅丑陋而且表现不佳 (2认同)
  • 等等,根据您使用双端队列的方式,双端队列的“前面”可能位于开头!(即`d[0]`) (2认同)

Gra*_*non 5

这是一个简单的实现,允许我在弹出之前检查队列的前面(使用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()
Run Code Online (Sandbox Code Playgroud)

输出

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
Run Code Online (Sandbox Code Playgroud)