Charlie Martin が提案するように a を使用するか(priority, object)
、単に__cmp__
オブジェクトに実装することができます。
挿入されたオブジェクトに特定のルールで優先順位を付けたい場合PriorityQueue
は、キー関数を受け入れる単純なサブクラスを作成すると非常に役立つことがわかりました。(priority, object)
タプルを手動で挿入する必要がなくなり、処理がより自然になります。
望ましい動作のデモ:
>>> h = KeyHeap(sum)
>>> h.put([-1,1])
>>> h.put((-1,-2,-3))
>>> h.put({100})
>>> h.put([1,2,3])
>>> h.get()
(-1, -2, -3)
>>> h.get()
[-1, 1]
>>> h.get()
[1, 2, 3]
>>> h.get()
set([100])
>>> h.empty()
True
>>>
>>> k = KeyHeap(len)
>>> k.put('hello')
>>> k.put('stackoverflow')
>>> k.put('!')
>>> k.get()
'!'
>>> k.get()
'hello'
>>> k.get()
'stackoverflow'
Python 2 コード
from Queue import PriorityQueue
class KeyHeap(PriorityQueue):
def __init__(self, key, maxsize=0):
PriorityQueue.__init__(self, maxsize)
self.key = key
def put(self, x):
PriorityQueue.put(self, (self.key(x), x))
def get(self):
return PriorityQueue.get(self)[1]
Python 3 コード
from queue import PriorityQueue
class KeyHeap(PriorityQueue):
def __init__(self, key, maxsize=0):
super().__init__(maxsize)
self.key = key
def put(self, x):
super().put((self.key(x), x))
def get(self):
return super().get()[1]
put
明らかに、キー関数が処理できないオブジェクトを挿入しようとすると、呼び出しによってエラーが発生します (発生するはずです!)。