在python中使用heapq作为优先级列表的问题

时间:2018-03-14 11:53:58

标签: python list object heap priority-queue

我无法理解为什么我的下面的代码会引发错误。

我试图基于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用于处理相同的密钥? 我不太了解这种行为。

非常感谢

2 个答案:

答案 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__来启用此功能。