2014-02-07 79 views

回答

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 
+0

list_.pop(0)对于大型列表很慢。 – dstromberg

+0

@dstromberg我相信这是暗示在我的答案。 – msvalkon

1

只使用pop()

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

它的速度很慢,每个元素都需要移动 –

9

流行从列表的前面是不是在所有的引用非常有效该列表需要更新。

deque将让你像排队操作有效

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

所以我可以通过执行a = Queue(list1)来创建一个列表进入队列,然后使用一个进一步的队列引用? – rggod

+0

是的。 deque被初始化为一个可迭代的列表,并支持大部分普通列表所需的所有操作。有关完整列表,请参阅答案中的链接。 – Cilyan

1

collections.deque是标准答案,但它不是抽象的非常好。

还有https://pypi.python.org/pypi/linked_list_mod/,如果你愿意牺牲一点速度以获得更好的抽象。 collections.deque更快。 linked_list_mod让你将一个迭代器传递给构造器;提供的lifo和fifo模块不会,但可以进行细微的修改。

1

由于我在使用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中测试过。

相关问题