gpt4 book ai didi

python - 如何为具有多个可比较属性的对象实现 __hash__

转载 作者:行者123 更新时间:2023-12-04 13:24:23 25 4
gpt4 key购买 nike

我有一个类(class)叫 Transaction ,其中包含多个属性。如果这些属性中的任何一个匹配,那么我希望将这些事务视为重复事务,因此不想在集合中存储重复项。

class Transaction:
def __init__(self, a, b):
self.a = a
self.b = b

def __eq__(self, other):
if not isinstance(other, Transaction):
return NotImplemented
return self.a == other.a or self.b == other.b

def __hash__(self):
# TODO
我了解到同时实现 __eq__ 很重要以及 __hash__如果我们想在插入集合时避免重复。此外,如果 A == B,则它们的哈希值也应根据合约匹配。
我该如何实现 __hash__在这种情况下,如果我尝试将交易插入到集合中,那么如果它包含属性“a”或“b”的重复值,则会被拒绝。
提前致谢!

最佳答案

我不确定是否可以压缩 or将这样的条件转换为单个哈希值。我尝试尝试应用德摩根定律( not nand 而不是 or ),但结果是空的。
使类型可散列的最佳选择可能只是返回一个常量值(这样所有实例都具有相同的散列),并依赖于散列表的冲突行为。
这是标准隐式允许的,因为规则是

a == b implies hash(a) == hash(b)


并不是

hash(a) == hash(b) implies a == b


从来没有这样的情况(毕竟,散列冲突预计偶尔会发生 - 散列只有 32 或 64 位大)

集合将通过其自然的避免碰撞行为来适应这种行为,虽然这根本不是高性能的,但它至少允许您使用 set首先是数据结构。
>>> class A:
... def __init__(self, prop):
... self.prop = prop
... def __repr__(self):
... return f'A({self.prop})'
... def __eq__(self, other):
... return self.prop == other.prop
... def __hash__(self):
... return 0
...
>>> {A(1), A(2), A(3), A(1)}
{A(1), A(2), A(3)}
诚然,这种违背了使用 set 的目的。 ,尽管如果您将对象用作 dict 中的键,可能会有更多的意义。 .

关于python - 如何为具有多个可比较属性的对象实现 __hash__,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69396676/

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