2012-02-15 72 views

回答

1

當您按照理論從隊列中獲取物品時,它將從隊列中移除。你必須編寫自己的函數,它會給你PriorityQueue的最後一個元素。您可以通過繼承priorityqueue來創建一個peek函數。

+0

假設我擴展了PriorityQueue,我仍然需要訪問下層數據存儲實施高峯權利?但是如何? – 2012-02-15 05:06:42

+1

如果你可以檢查代碼http://hg.python.org/cpython/file/2.7/Lib/Queue.py,那麼他們使用列表來存儲數據。所以你可以在列表中隨意玩這個列表,在這個例子中它是'self.queue'。另外你可以檢查'_get'方法的PriorityQueue,所以如果你想改變那個功能,那麼也可以重寫那個函數。 – Nilesh 2012-02-15 05:19:52

+0

是和python一樣的cpython嗎? – 2012-02-15 08:05:10

2

索引隊列的第一個元素應該工作。如果您使用的heapq庫,文件中提到:

堆的有趣的特性是,它的最小元素始終是根,heap[0]

23

如果是一個PriorityQueue對象,你可以使用a.queue [0],以獲得下一個項目:

from Queue import PriorityQueue 

a = PriorityQueue() 

a.put((10, "a")) 
a.put((4, "b")) 
a.put((3,"c")) 

print a.queue 
print a.get() 
print a.queue 
print a.get() 
print a.queue 

輸出爲:

[(3, 'c'), (10, 'a'), (4, 'b')] 
(3, 'c') 
[(4, 'b'), (10, 'a')] 
(4, 'b') 
[(10, 'a')] 

,但要小心的多線程訪問。

+0

並注意,get()在默認情況下阻塞哪個索引不會執行。 – Zitrax 2014-04-29 20:56:32

+0

在多線程的情況下,我們可以鎖定q.mutex,並在讀取q.queue [0]後釋放鎖。 – Sush 2016-05-17 06:00:16

+1

似乎雖然'q.queue [0]'返回隊列中最高優先級的項目,'q.queue [1]'不一定返回第二個最高優先級項目 – Woofas 2017-01-27 02:26:49

3

如果你想在時Queue下一個元素,在元素的插入順序,使用方法:

for i in range(len(queue)): 
    print queue.queue[i] 

這不會彈出任何東西了。

如果你想它的優先級順序,使用方法:

for i in range(len(queue)): 
    temp = queue.get() 
    queue.put(temp) 
    print temp 

如果您正在使用的,而不是一個變量的元組,通過更換溫度:

((temp1,temp2)) 
+0

此解決方案不僅限於PriorityQueue對象。它也適用於Queue對象。看起來像我最優雅的解決方案。沒有任何意圖,但我不明白其他答案如何接近這個(imho)。 – MikeyE 2017-03-22 02:48:43

0

假設存儲在您的項目在PriorityQueue中是一個元組(key,value),

def peak(pq): 
    return pq.queue[0][1] 
相關問題