アイテムを優先キューに入れるにはどうすればいいですか? 質問する

アイテムを優先キューに入れるにはどうすればいいですか? 質問する

Pythonのドキュメントでは、

最も値の低いエントリが最初に取得されます (最も値の低いエントリは によって返されるエントリですsorted(list(entries))[0])。エントリの一般的なパターンは、次の形式のタプルです: (priority_number, data)

キューは優先度、データの順にソートされるようですが、必ずしも正しいとは限りません。データ「アイテム 2」が「アイテム 1」より前にキューに入れられたと仮定すると、アイテム 1 がやはり最初に並びます。別のドキュメント ページでは、ヒープ、カウンターの使用を提案しています。なので、私はentry = [priority, count, task]次のようにデータを保存します。

PriorityQueue.put(item, priority)

そうすれば、自分で順序付けを実装する必要はなくなるのでしょうか?

ベストアンサー1

文字列データの英数字によるソートが適切でない場合は、タプルの 2 番目の項目を二次優先度として使用します。日付/時刻の優先度を使用すると、同じ優先度の項目が複数ある場合に FIFIO キューにフォールバックする優先キューが提供されます。二次数値優先度のみを使用したサンプル コードを以下に示します。2 番目の位置で日付時刻値を使用するのは非常に簡単な変更ですが、うまく動作しない場合はコメントでお気軽にお知らせください。

コード

import Queue as queue

prio_queue = queue.PriorityQueue()
prio_queue.put((2, 8, 'super blah'))
prio_queue.put((1, 4, 'Some thing'))
prio_queue.put((1, 3, 'This thing would come after Some Thing if we sorted by this text entry'))
prio_queue.put((5, 1, 'blah'))

while not prio_queue.empty():
    item = prio_queue.get()
    print('%s.%s - %s' % item)

出力

1.3 - This thing would come after Some Thing if we didn't add a secondary priority
1.4 - Some thing
2.8 - super blah
5.1 - blah

編集

タイムスタンプを使用して日付による二次優先度として FIFO を偽装すると、次のようになります。偽装と言っているのは、非常に近い時間に追加されたエントリは正確に FIFO にならない可能性があるため、おおよそ FIFO に過ぎないからです。この単純な例が妥当な方法で機能するように、短いスリープを追加しました。これが、目的の順序を取得する方法の別の例として役立つことを願っています。

import Queue as queue
import time

prio_queue = queue.PriorityQueue()
prio_queue.put((2, time.time(), 'super blah'))
time.sleep(0.1)
prio_queue.put((1, time.time(), 'This thing would come after Some Thing if we sorted by this text entry'))
time.sleep(0.1)
prio_queue.put((1, time.time(), 'Some thing'))
time.sleep(0.1)
prio_queue.put((5, time.time(), 'blah'))

while not prio_queue.empty():
    item = prio_queue.get()
    print('%s.%s - %s' % item)

おすすめ記事