如何解决Python中的set用于测试对象之间的相等性是什么?
我已经用Python编写了一些代码,该代码具有一个名为product的类,并覆盖了魔术函数__eq__
和__hash__
。现在,我需要制作一个集合,该集合应根据产品的ID
从列表中删除重复项。如您所见,this代码的输出是两个对象的哈希值相同,但是当我将这两个对象设为一组时,长度为2而不是一个。
但是,当我将代码的__eq__
方法更改为此时
def __eq__(self,b) -> bool:
if self.id == b.id:
return True
return False
并将其与工作的散列函数一起使用,并且集合的长度为1。因此,对于集合数据结构是使用__eq__
方法测试是否相等还是使用{{1} }方法。
解决方法
相等性测试可能会很昂贵,因此该设置以比较散列开始。如果哈希值不相等,则检查结束。如果哈希值相等,则该集合将测试相等性。如果仅使用__eq__
,则可能不得不做很多不必要的工作,但是,如果仅使用__hash__
,将无法解决哈希冲突。
这是一个使用相等性解决哈希冲突的简单示例。除-1
之外,所有整数都是它们自己的哈希值:
>>> hash(-1)
-2
>>> hash(-2)
-2
>>> s = set()
>>> s.add(-1)
>>> -2 in s
False
这是因为哈希值不相等而跳过相等性检查的集合的一个示例。让我们将int
子类化,使其每秒返回一个新的哈希值:
>>> class TimedInt(int):
... def __hash__(self):
... return int(time.time())
...
>>> a = TimedInt(5)
>>> a == 5
True
>>> a == a
True
>>> s = set()
>>> s.add(a) # Now wait a few seconds...
>>> a in s
False
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。