私はPythonに比較的慣れていません。と一緒に作業しようqueue.PriorityQueue()
class
としていますが、質問があります。特定の優先順位が存在するかどうかを確認する方法はありますか?
たとえば、私は次のものを持っています(priority, element)
:
(0,A), (1,B), (2,C), (2,D)
優先順位2
が存在するかどうかを確認する方法はありますか?(はい、C
とD
は両方とも2です。)特定の優先度の要素を取得できますか?私は優先順位を持つ要素をしたいのであれば、2
それは私を与えるC
とD
?
優先キューで私が見た唯一の公式ドキュメントは次のとおりです。優先キューの公式ドキュメント
このクラスに関する他のドキュメントはありますか?私が使用できる方法のように?利用可能なクラス/フィールドの構造?
私の理解では、あなたの最終目標は、同じ優先順位のタスクをリストに入れて一緒に返すことです。そう:
queue.PriorityQueue
(私が行った)のコードを見ると、ヒープキューアルゴリズムを実装するモジュールのメソッドheappush
とheappop
メソッドに基づいていることがわかりheapq
ます。heapqを参照してください。このページをもう少し見てみると、heapqを使用して優先度付きキューを実装する方法も示されています。この実装は、すでに追加されたタスクの優先度を変更する機能をサポートし、同じ優先度の複数のタスクを希望どおりに処理しないという点で、必要なものよりも少し複雑です。しかし、これらの変更は簡単に行うことができます。
from heapq import heappush, heappop
class PriorityQueue:
def __init__(self):
self._pq = [] # list of entries arranged in a heap
self._priority_finder = {} # mapping of priority to entries
def add_task(self, task, priority=0):
'Add a new task'
# any tasks with this priority?
entry = self._priority_finder.get(priority)
if entry:
entry[1].append(task)
else:
entry = [priority, [task]]
self._priority_finder[priority] = entry
heappush(self._pq, entry)
def pop_task(self):
'Remove and return the lowest priority tasks. Raise KeyError if empty.'
if not self._pq:
raise KeyError('pop from an empty priority queue')
priority, tasks = heappop(self._pq)
del self._priority_finder[priority]
return priority, tasks
def __bool__(self):
'return True if any tasks on the queue'
return True if self._pq else False
pq = PriorityQueue()
pq.add_task('a', 4) # task 'a' with priority 4
pq.add_task('b', 2)
pq.add_task('c', 4)
pq.add_task('d', 2)
pq.add_task('e', 1)
while pq:
print(pq.pop_task())
プリント:
(1, ['e'])
(2, ['b', 'd'])
(4, ['a', 'c'])
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加