请参阅优先级队列实现说明-就在您引用的部分之前(关于 using )dataclasses
它告诉您如何在没有它们的情况下执行此操作:
... 是将条目存储为 3 元素列表,包括优先级、条目计数和任务。条目计数用作决胜局,以便具有相同优先级的两个任务按照它们添加的顺序返回。并且由于没有两个条目计数相同,元组比较永远不会尝试直接比较两个任务。
因此,在添加到队列时,只需将您的项目添加为元组中的第三个元素。(Prio, Count, YourElem)
拟定示例:
from queue import PriorityQueue
class CompareError(ValueError): pass
class O:
def __init__(self,n):
self.n = n
def __lq__(self):
raise CompareError
def __repr__(self): return str(self)
def __str__(self): return self.n
def add(prioqueue,prio,item):
"""Adds the 'item' with 'prio' to the 'priorqueue' adding a unique value that
is stored as member of this method 'add.n' which is incremented on each usage."""
prioqueue.put( (prio, add.n, item))
add.n += 1
# no len() on PrioQueue - we ensure our unique integer via method-param
# if you forget to declare this, you get an AttributeError
add.n = 0
h = PriorityQueue()
add(h, 7, O('release product'))
add(h, 1, O('write spec 3'))
add(h, 1, O('write spec 2'))
add(h, 1, O('write spec 1'))
add(h, 3, O('create tests'))
for _ in range(4):
item = h.get()
print(item)
使用h.put( (1, O('write spec 1')) )
导致
TypeError: '<' not supported between instances of 'O' and 'int'`
使用def add(prioqueue,prio,item):
pushs 三元组作为保证不同的第二个值的项目,因此我们的O()
-instances 永远不会用作决胜局。
输出:
(1, 2, write spec 3)
(1, 3, write spec 2)
(1, 4, write spec 1)
(3, 5, create tests)
请参阅MartijnPieters回答@here以获得更好的独特第二元素。