我正在使用python进行工作,而heapq出现了一些问题。当我将元素推入堆时,我收到此错误:
TypeError:“ Point”和“ Point”的实例之间不支持“ <”
重点是我的内部课程。我推入由(float,Point)组成的元组,根据文档,heapq应该使用float作为键,但事实并非如此。为了更精确,有时使用float而不是总是使用。问题是什么?
您需要在Point类中定义相对比较操作。这意味着:
__lt__(self, other)为了<
__le__(self,other)为了<=
和可选的
__gt__(self, other)为了>
__ge__(self, other)为了>=。
最后两个是可选的,因为如果未指定,则采用le和的否定lt。
这些方法的一般结构是__name__(self, other),其中other是要与 进行比较的对象self。此外,他们返回True或False。
您还可以定义__eq__而不是上面所有四个,其工作方式类似于 Java 中的比较器。self如果大于,则此方法应返回正整数other;如果相等,则返回 0;如果other大于,则返回负整数self。
heapq将<=在您放入的所有内容上使用运算符。
比较元组的位置:将第一元组的第一项与第二元组的第一项进行比较;如果它们不相等(即第一个大于或小于第二个),则这是比较的结果,否则将考虑第二个,然后是第三个,依此类推。
如果每个元组的第一项都是唯一的,则比较将始终仅在第一项上进行:
>>> x = (1, object())
>>> y = (2, object())
>>> x <= y
True
Run Code Online (Sandbox Code Playgroud)
(注意:我曾经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'
Run Code Online (Sandbox Code Playgroud)
因此,您可以在对象中实现比较运算符,或者确保元组中的前面的项目始终可比较,并且一起唯一。
例如,您可以将对象的ID添加到元组,以便您的元组变为:
(priority, id(obj), obj)
Run Code Online (Sandbox Code Playgroud)
因为对象ID是唯一的。(请注意:如果添加具有相同优先级的同一对象的两个实例,您将再次遇到此问题)。
| 归档时间: |
|
| 查看次数: |
1680 次 |
| 最近记录: |