Python - 当识别出重复项时,集合或卡住集合采用哪个对象?

标签 python hash set

我有一个用户定义的类 MyClass,它具有 __hash____eq__ 实现,可确保例如:

>>> a = MyClass([100, 99, 98, 97])
>>> b = MyClass([99, 98, 97, 100])
>>> a.__hash__() == b.__hash__()
True
>>> a == b
True

问题:如果我执行以下操作:

>>> x = [a, b]
>>> set(x)

我可以指望set保留a吗?集合__init__是否按顺序迭代x?或者我是否需要担心它会随机获取 b

谢谢

迈克

最佳答案

在这些基于哈希的情况下,它同时使用 __hash____eq__

如果 __hash____eq__ 相同,则采用迭代中的第一个。当它到达下一个时,它会检查是否已经拥有它并决定是。

>>> class Same(object):
...     def __init__(self, value):
...         self.value = value
...     def __hash__(self):
...         return 42
...     def __eq__(self, other):
...         return True
...     def __repr__(self):
...         return 'Same(%r)' % self.value
>>> set([Same(2), Same(1)])
set([Same(2)])
>>> set([Same(1), Same(2)])
set([Same(1)])

有了dict,它就变得更有趣了:

>>> {Same(1): 1, Same(2): 2}
{Same(1): 2}
>>> {Same(1): 2, Same(2): 1}
{Same(1): 1}
>>> {Same(2): 1, Same(2): 2}
{Same(2): 2}
>>> {Same(2): 2, Same(2): 1}
{Same(2): 1}
>>> {Same(2): 2, Same(2): 1}
{Same(2): 1}

您应该能够猜到这里发生了什么。它存储第一个项目,然后第二个项目的散列/相等性相同;然而,它有一个不同的值,所以它存储它。 总是被覆盖,无论它们是否匹配:

>>> {Same(1): Same(2), Same(3): Same(4)}
{Same(1): Same(4)}

希望对您有所帮助。

关于Python - 当识别出重复项时,集合或卡住集合采用哪个对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4273686/

相关文章:

python - python中的嵌套正则表达式

python - concurrent.futures.ThreadPoolExecutor 吞噬异常(Python 3.6)

python - 创建充当校验和并验证发件人的文件的最佳方法?

python - 在将 python 集与自定义对象相交时选择要保留的元素

python - 识别 Pandas DataFrame 中每一行的第一个和所有非零值

python - 从 Python/Pandas Dataframe 的列表列中的列表中删除空格或 NaN

java - 是否有专门针对 BitSet 的哈希函数?

c++ - 如何组合加密哈希?

php - 在 php 中为类自动生成 getter 和 setter 的最佳方法是什么?

Jaccard 的 Python 包函数集合之间的相似性?