2014-02-07 135 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中測試過。

相關問題