如何将列表转换为队列?这样就可以进行入队或出队等操作。我想使用列表删除最顶层的值,我相信它可以使用队列完成。
答案 0 :(得分:11)
从列表前面弹出效率不高,因为列表中的所有引用都需要更新。
deque将允许您有效地排队操作
>>> from collections import deque
>>> deque([1,2,3,4])
deque([1, 2, 3, 4])
答案 1 :(得分:3)
只需使用pop()
>>> x = [1,2,3]
>>> x.pop(0)
1
>>> x
[2,3]
答案 2 :(得分:3)
由于我在使用queue.Queue
时正在寻找这个问题的答案,我认为我应该分享我的发现。可以使用queue.queue
将列表转换为队列。
import queue
l = [i for i in range(1000)]
q = queue.Queue()
[q.put(i) for i in l]
q2 = queue.Queue()
q2.queue = queue.deque(l)
运行此代码后,q
和q2
是两个不同的队列,其中包含完全相同的条目,但第二种方法在我的计算机上快了> 300倍。
与问题无关,但如果l = list(q.queue)
是q
的实例,则queue.Queue
可以完成相反的操作。希望这能为您省去一些麻烦!
这都是在python 3.5.2中测试的。
答案 3 :(得分:1)
还有https://pypi.python.org/pypi/linked_list_mod/,如果你愿意为了更好的抽象而牺牲一点速度。 collections.deque更快。 linked_list_mod允许您将迭代器传递给构造函数;提供的lifo和fifo模块没有,但可以通过修改来完成。
答案 4 :(得分:0)
您可以将列表用作队列。如果您想要一个fifo队列,只需使用.append()
添加和.pop(0)
即可删除。对于lifo队列(即堆栈),使用.append()
添加并.pop()
删除。
在实现专门为此目的设计的fifo队列时,您应该使用collections.deque。 .pop(0)
是O(n)操作。使用列表作为堆栈就可以了。
FIFO队列:
In [1]: q = range(15)
In [2]: q.pop(0)
Out[2]: 0
In [3]: q.pop(0)
Out[3]: 1
In [4]: q.pop(0)
Out[4]: 2
LIFO队列:
In [5]: q = range(10)
In [6]: q.pop()
Out[6]: 9
In [7]: q.pop()
Out[7]: 8
In [8]: q.pop()
Out[8]: 7