我正在尝试在Python中实现优先级队列。我正在关注我在网上找到的example。 Skill
类会覆盖__cmp__
方法,以便优先级队列可以自行排序。我跑的时候收到错误:
TypeError: unorderable types: Skill() < Skill()
我在网上发现了几个例子,只要你重写__cmp__()
方法,优先级队列应该是好的。
try:
import Queue as Q # ver. < 3.0
except ImportError:
import queue as Q
class Skill(object):
def __init__(self, priority, description):
self.priority = priority
self.description = description
print ('New Level:', description)
return
def __cmp__(self, other):
return cmp(self.priority, other.priority)
q = Q.PriorityQueue()
q.put(Skill(5, 'Proficient'))
q.put(Skill(10, 'Expert'))
q.put(Skill(1, 'Novice'))
while not q.empty():
next_level = q.get()
print ('Processing level:', next_level.description)
我目前在计算机上运行Python 3.4.1。
答案 0 :(得分:4)
__cmp__
,您应该使用丰富的比较dunder方法__lt__
,__le__
,__eq__
,__ne__
,{{1} },__gt__
。
他们的工作如下:
__ge__
您还可以使用类装饰器functools.total_ordering
,它允许您指定a < b # a.__lt__(b)
a <= b # a.__le__(b)
a == b # a.__eq__(b)
a != b # a.__ne__(b)
a > b # a.__gt__(b)
a >= b # a.__ge__(b)
和__eq__
中的任何一个,并且它将推断其余的丰富比较方法。
__lt__, __le__, __gt__, __ge__
答案 1 :(得分:1)
cmp
和__cmp__
仅用于Python 2.x;它们不再存在于Python 3.x中。如今,您通过实施__eq__
,__ne__
,__lt__
,__gt__
,__ge__
和__le__
直接重载比较运算符。
您可以在Ordering Comparisons下的“Python 3.0新功能”页面中了解此更改:
cmp()
函数应视为已消失,__cmp__()
不再支持特殊方法。使用__lt__()
进行排序,__eq__()
__hash__()
{{1}},以及其他必要的丰富比较。