我无法理解为什么我的下面的代码会引发错误。
我试图基于Python的heapq模块构建优先级列表。 与模块的基本示例的唯一区别是希望将其与自定义对象一起使用,而不是简单(int,int)或(int,str)元组。
import heapq
class MyObject():
def __init__(self,a=0,name='toto'):
self.a = a
self.name = name
if __name__ == '__main__':
priority_list = []
heapq.heappush(priority_list,(1,MyObject()))
heapq.heappush(priority_list,(1,MyObject()))
这是我的错误:
heapq.heappush(priority_list,(1,MyObject()))
TypeError: '<' not supported between instances of 'MyObject' and 'MyObject'
如果我使用不同的密钥插入堆中,则不会引发错误,但是不应该将heapq用于处理相同的密钥? 我不太了解这种行为。
非常感谢
答案 0 :(得分:1)
未为您的班级定义运算符<
。这样heapq
无法定义优先级。
ob1 = MyObject()
ob1 < ob1
加注
TypeError: unorderable types: MyObject() < MyObject()
然后必须定义逻辑运算符。有关详细信息,请参阅this。
class MyObject():
def __init__(self,a=0,name='toto'):
self.a = a
self.name = name
def __lt__(ob1, ob2):
return ob1.a < ob2.a
ob1 = MyObject()
ob1 < ob1 # returns False
答案 1 :(得分:0)
堆具有最小对象始终位于顶部的属性。为了使Python保留该不变量,它必须有一些方法来确定哪个对象更小。您的MyObject类不提供此功能。
您可以定义__gt__
或__lt__
来启用此功能。