可以在python中将列表转换为队列吗?

时间:2014-02-07 23:54:03

标签: python

如何将列表转换为队列?这样就可以进行入队或出队等操作。我想使用列表删除最顶层的值,我相信它可以使用队列完成。

5 个答案:

答案 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)

运行此代码后,qq2是两个不同的队列,其中包含完全相同的条目,但第二种方法在我的计算机上快了> 300倍。

与问题无关,但如果l = list(q.queue)q的实例,则queue.Queue可以完成相反的操作。希望这能为您省去一些麻烦!

这都是在python 3.5.2中测试的。

答案 3 :(得分:1)

collections.deque是标准的答案,虽然它的抽象效果并不理想。

还有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