heapq push TypeError:实例之间不支持“ <”

时间:2018-11-30 08:54:21

标签: python heapq

我正在python中工作,heapq存在一些问题。 当我将一个元素推入堆时,我收到此错误:

TypeError:“ Point”和“ Point”的实例之间不支持“ <”

Point是我的内部课程。 我推了一个由(float,Point)组成的元组,根据文档,heapq应该使用float作为键,但事实并非如此。为了更精确,有时使用float而不是总是使用。 有什么问题吗?

2 个答案:

答案 0 :(得分:2)

您需要在Point类中定义相对比较操作。 这意味着:

__lt__(self, other) for <

__le__(self,other) for <=

和可选y

__gt__(self, other) for >

__ge__(self, other)代表>=

最后两个是可选的,因为如果未指定,则取反lelt

这些方法的一般结构为__name__(self, other),其中other是将与self比较的对象。另外,它们返回TrueFalse

您也可以定义__eq__而不是上面的所有四个,其作用类似于Java中的比较器。如果self大于other,则此方法应返回正整数;如果它们相等,则返回0;如果other大于self,则返回负整数。

答案 1 :(得分:2)

heapq将对您放入的任何内容使用<=运算符。

按位置对两个图元进行比较:将第一个元组的第一项与第二个元组的第一项进行比较;如果它们不相等(即第一个大于或小于第二个),则这是比较的结果,否则考虑第二个,然后考虑第三个,依此类推。

如果每个元组的第一项都是唯一的,则比较将始终仅在第一项上进行:

>>> x = (1, object())
>>> y = (2, object())
>>> x <= y
True

(注意:我使用object()创建了一个匿名对象,该对象未实现比较运算符)

当元组的第一项不是唯一时(即第一组元组对于一对元组来说是相等的),就会出现问题,那么比较将不得不比较元组的第二项:

>>> z = (1, object())
>>> x <= z
Traceback (most recent call last):
  File "<input>", line 1, in <module>
    x <= z
TypeError: '<=' not supported between instances of 'object' and 'object'

因此,您可以在对象中实现比较运算符,或者确保元组中的前述各项始终可比较,并且一起唯一。

例如,您可以将对象的ID添加到元组中,以便您的元组变为:

(priority, id(obj), obj)

,因为对象ID是唯一的。 (请注意:如果添加具有相同优先级的同一对象的两个实例,您将再次遇到此问题。)