gpt4 book ai didi

python - heapq 推送比较如何在 2.7 和 3.x 中工作

转载 作者:行者123 更新时间:2023-11-28 17:37:28 25 4
gpt4 key购买 nike

import heapq

class Foo(object):
def __init__(self, x):
self._x = x

l = [Foo(1)]
heapq.heapify(l)
heapq.heappush(l, Foo(2))

这适用于 Python 2.7 但不适用于 3.x。如文档中所述

In the future with Python 3, tuple comparison breaks for (priority, task) pairs if the priorities are equal and the tasks do not have a default comparison order.

在 2.7 的 heapq.heappush 中如何处理不可比较的对象?

最佳答案

让我们假设您希望 Foo 实例通过它们的 ._x 值进行比较。您的代码可以在 2.x 中运行,但它不会以任何合理的方式工作,因为 Foo instancex 将通过它们的 id 进行比较。 Python 3 通过没有无用的默认值来保护您免受此类无声错误的侵害。 heapq 至少使用 < .下面的代码在 3.x 中运行并且在 2.x 和 3.x 中运行正常,至少对于这个例子来说是这样。

import heapq

class Foo(object):
def __init__(self, x):
self._x = x
def __repr__(self):
return 'Foo(%s)' % self._x
def __lt__(self, other):
return self._x < other._x

l = [Foo(1)]
heapq.heapify(l)
heapq.heappush(l, Foo(2))
print(l)

根据需要或期望添加其他丰富的比较方法。您可以添加 if isinstance(other, Foo) else NotImplemented到每个 return 的结尾表达式来更好地与非 Foo 实例进行比较。

关于python - heapq 推送比较如何在 2.7 和 3.x 中工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28995735/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com