我想在决定是否弹出之前检查队列前面的条件。如何在collect.deque?#/ p>的python中实现这一点
list(my_deque)[0]
看起来很难看并且表现不佳。
答案 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)
这是一个简单的实现,允许我在弹出之前检查队列的开头(使用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 :(得分: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]
查看最后一个元素
这不需要从左或右弹出元素,而且看起来也很有效。