gpt4 book ai didi

Python - 当识别出重复项时,set 或 frozenset 取哪个对象?

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

我有一个用户定义的类 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__ 都相同,那么它在 iterable 中到达的第一个被采用。当它到达下一个时,它会检查它是否已经拥有它并决定是。

>>> 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 - 当识别出重复项时,set 或 frozenset 取哪个对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4273686/

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