我想在决定是否弹出之前检查队列前面的条件。我怎样才能在Python中使用collections.deque来实现这一点?
list(my_deque)[0]
看起来很丑而且性能很差。
TL;DR: 假设您的
deque
称为 d
,只需检查 d[0]
,因为双端队列中的“最左边”元素是前面(您可能需要在双端队列的长度之前进行测试,以使确保它不为空)。采纳@asongtoruin的建议,使用if d:
来测试双端队列是否为空(它相当于if len(d) != 0:
,但更Pythonic)
因为
deque
是可转位的 并且您正在测试前端。虽然 deque
具有类似于列表的界面,但其实现针对前台和后台操作进行了优化。引用文档:
双端队列支持线程安全、内存高效的追加和弹出 双端队列的两侧具有大致相同的 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]
轻松找到最后一个元素。
这是一个简单的实现,允许我在弹出之前检查队列的前面(使用
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
假设你的双端队列是从Python集合实现的
from collections import deque
deque = deque() //syntax
Deque 也可以解释为使用索引访问的列表。 您可以使用
deque[0]
查看前面的元素,并使用 deque[-1]
查看最后一个元素
这不需要从左或右弹出元素,而且看起来也很高效。