如何将列表转换为队列?这样就可以执行像入队或出队的操作了。我想使用列表来移除最上面的值,并且我相信这可以使用队列来完成。
从列表的前面删除元素并不是很有效率,因为列表中所有的引用都需要被更新。
deque将允许您高效地执行队列操作。
>>> from collections import deque
>>> deque([1,2,3,4])
deque([1, 2, 3, 4])
我在使用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多倍。不相关于问题,但是如果q
是queue.Queue
的实例,则可以通过l = list(q.queue)
来执行相反操作。希望这可以为您节省一些麻烦!这都是在Python 3.5.2中测试过的。只需使用pop()
即可。
>>> x = [1,2,3]
>>> x.pop(0)
1
>>> x
[2,3]
.append()
添加,.pop(0)
删除。对于LIFO队列(即堆栈),请使用.append()
添加,.pop()
删除。.pop(0)
是一个O(n)操作。使用列表作为堆栈是完全可以的。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
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
collections.deque是标准答案,尽管它的抽象程度不是很好。
如果你愿意为更好的抽象牺牲一点速度,也可以使用https://pypi.python.org/pypi/linked_list_mod/。collections.deque更快。linked_list_mod允许你将可迭代对象传递给构造函数;提供的lifo和fifo模块不行,但可以轻松修改。