heapq push TypeError: '<' not supported between instances

heapq push TypeError: '<' not supported between instances

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

TypeError: 'Point' 和 'Point'

实例之间不支持“<”

点是我的内在class。 我推送一个由 (float,Point) 形成的元组,根据文档,heapq 应该使用 float 作为键,但它没有。更准确地说,有时使用 float 但并非总是如此。 有什么问题?

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

__lt__(self, other) 对于 <

__le__(self,other) 对于 <=

和可选的

__gt__(self, other) 对于 >

__ge__(self, other) 对于 >=

最后两个是可选的,因为如果未指定,将采用 lelt 的否定。

这些方法的一般结构是 __name__(self, other),其中 other 是将与 self 进行比较的对象。此外,他们 return TrueFalse.

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

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'

所以,要么在对象中实现比较运算符:

  • __lt__(self, other) 对于 <
  • __le__(self, other) 对于 <=
  • (可选)__gt__(self, other) for >
  • (可选)__ge__(self, other) for >=

否则你要确保元组中的前面的项目总是可比较的并且在一起是唯一的。

例如,您可以将对象的 ID 添加到元组中,这样您的元组就变成:

(priority, id(obj), obj)

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