在Python中,是否有可能将列表转换为队列?

26

如何将列表转换为队列?这样就可以执行像入队或出队的操作了。我想使用列表来移除最上面的值,并且我相信这可以使用队列来完成。

5个回答

27

从列表的前面删除元素并不是很有效率,因为列表中所有的引用都需要被更新。

deque将允许您高效地执行队列操作。

>>> from collections import deque
>>> deque([1,2,3,4])
deque([1, 2, 3, 4])

1
我能否通过执行a = Queue(list1)将列表转换为队列,然后使用a作为任何进一步队列引用? - rggod
deque是用可迭代对象进行初始化的,其中包括列表,并支持大多数普通列表的操作。有关完整列表,请参见答案中的链接。 - Cilyan

16

我在使用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多倍。不相关于问题,但是如果qqueue.Queue的实例,则可以通过l = list(q.queue)来执行相反操作。希望这可以为您节省一些麻烦!这都是在Python 3.5.2中测试过的。

1
你应该使用 "from collections import deque" 而不是 queue。queue 模块主要用于多个线程使用的队列中的消息。而 deque 是双端队列。 - Wesley Lin

8

只需使用pop()即可。

>>> x = [1,2,3]
>>> x.pop(0)
1
>>> x
[2,3]

1
它很慢,每个元素都需要被移动。 - Jackson Tale

1
您可以使用列表作为队列。如果您想要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

对于大型列表,list_.pop(0) 的速度较慢。 - dstromberg
1
@dstromberg 我相信我的回答已经暗示了这一点。 - msvalkon
队列(queue)是线程安全的,而列表(lists)可能不是。 - Appaji Chintimi

1

collections.deque是标准答案,尽管它的抽象程度不是很好。

如果你愿意为更好的抽象牺牲一点速度,也可以使用https://pypi.python.org/pypi/linked_list_mod/。collections.deque更快。linked_list_mod允许你将可迭代对象传递给构造函数;提供的lifo和fifo模块不行,但可以轻松修改。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接