2013-05-22 59 views
4

是否可以在不調用.get()的情況下檢查Python中Queue中的項目?根據文檔,隊列中不允許建立索引。我需要檢查隊列頭部的項目是否滿足某些條件,如果是,請將其從隊列中移除。同樣,我需要檢查隊列中是否有其他項目滿足相似的條件並將其刪除。檢查python中的項目隊列

我在這裏使用了錯誤的數據結構嗎?

+2

聽起來你應該使用['collections.deque'](http://docs.python.org/2/library/collections.html#collections.deque),而不是使用線程? – jamylak

+0

不,我不使用線程 – damon

回答

2

Queue模塊實現多生產,多消費隊列。當信息必須在多個線程之間安全地交換時,它在線程編程中特別有用。

正如你所看到的,Queue模塊是專爲使用線程創建的,只提供FIFOLIFO優先級隊列,其中沒有提供此功能。但是通過檢查Queue模塊的source code,您會發現它只是使用可輕鬆完成任務的collections.deque(雙端隊列)。您可以在第一個項目([0])和.popleft()的固定時間內索引。

6

queue_object.queue將在deque對象中返回您的隊列副本,然後您可以使用該片段。當然,它不會與原始隊列同步,但會允許您在複製時查看隊列。

有一個很好的合理化爲什麼你不想這樣做在這個線程詳細解釋comp.lang.python - Queue peek?。但是如果你只是想了解Queue的工作方式,這是一個簡單的方法。

import Queue 
q = Queue.Queue() 
q.push(1) 
q.put('foo') 
q.put('bar') 
d = q.queue 
print(d) 
deque(['foo', 'bar']) 
print(d[0]) 
'foo' 
+0

-1 OP應該單獨使用'deque',這是一個不好的方法。 – jamylak

+0

和你-1我一個人,因爲我正確回答他的問題? ..這真的很無禮。你沒有考慮到他可能正在使用需要隊列互斥體的_現有代碼_並且他只是試圖理解它是如何工作的 - 觀察隊列。要解決這個問題(這是一個合理的新手問題),或者-1我的正確答案是違背了計算器的精神並試圖幫助人們。 – synthesizerpatel

+0

我'-1d'因爲你沒有正確回答它,你沒有提及如何刪除它,也是這項工作的錯誤任務(OP不需要評論中提到的Queue mutex) – jamylak