JSS*_*all 14 python collections deque
我想在决定是否弹出之前检查队列前面的条件.如何在collect.deque的python中实现这一点?
list(my_deque)[0]
Run Code Online (Sandbox Code Playgroud)
表现难看,表现不佳.
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).
这是一个简单的实现,允许我在弹出之前检查队列的前面(使用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()
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)
| 归档时间: |
|
| 查看次数: |
7559 次 |
| 最近记录: |