我正在python中工作,heapq存在一些问题。 当我将一个元素推入堆时,我收到此错误:
TypeError:“ Point”和“ Point”的实例之间不支持“ <”
Point是我的内部课程。 我推了一个由(float,Point)组成的元组,根据文档,heapq应该使用float作为键,但事实并非如此。为了更精确,有时使用float而不是总是使用。 有什么问题吗?
答案 0 :(得分:2)
您需要在Point
类中定义相对比较操作。
这意味着:
__lt__(self, other)
for <
__le__(self,other)
for <=
和可选y
__gt__(self, other)
for >
__ge__(self, other)
代表>=
。
最后两个是可选的,因为如果未指定,则取反le
和lt
。
这些方法的一般结构为__name__(self, other)
,其中other
是将与self
比较的对象。另外,它们返回True
或False
。
您也可以定义__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是唯一的。 (请注意:如果添加具有相同优先级的同一对象的两个实例,您将再次遇到此问题。)