代码之家  ›  专栏  ›  技术社区  ›  Rodolphe Lemasquerier

在python中使用heapq获取优先级列表的问题

  •  1
  • Rodolphe Lemasquerier  · 技术社区  · 8 年前

    我不明白为什么我下面的代码会出错。

    我正在尝试基于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 回复  |  直到 8 年前
        1
  •  3
  •   Pedro H. N. Vieira    8 年前

    操作员 < 未为您的类定义。那样的话 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
    
        2
  •  0
  •   Daniel Roseman    8 年前

    堆的属性是最小的对象始终位于顶部。为了让Python保持不变,它必须有某种方法来确定哪个对象更小。MyObject类不提供此功能。

    您可以定义 __gt__ __lt__ 以启用此功能。