gpt4 book ai didi

python - python 中集合相等的异常行为

转载 作者:太空宇宙 更新时间:2023-11-04 10:01:41 25 4
gpt4 key购买 nike

当我运行这行代码时,我不明白为什么两个 lists 是相等的,但是从同一个列表创建的 sets 却不同

class Field(object):
def __init__(self, fieldnames):
self.name = fieldnames[0]
self.alias = frozenset(fieldnames)

def __eq__(self, other):
if not isinstance(other, Field):
return False
return len(self.alias & other.alias) >= 1

def __hash__(self):
return hash(self.name)

def __str__(self):
return "{field_name: %s}" % self.name

def __repr__(self):
return "<Field: (%s: %r)" %(self.name, self.alias)

In [185]: field_list1 = [["Field 1"], ["Field 2"], ["Field 3"]]

In [186]: field_list2 = [["Field 1"], ["Field 21", "Field 2"], ["Field 3"]]

In [187]: field1 = [Field(f) for f in field_list1]

In [188]: field2 = [Field(f) for f in field_list2]

In [189]: field1 == field2
Out[189]: True

In [190]: set(field1) == set(field2)
Out[190]: False

根据关于集合的 python 文档,如果第一个集合的每个元素都在第二个集合中,则两个集合相等,反之亦然。根据该定义,两个集合应该相等,但我不确定为什么它们不相等。

Therefore I wanted to know reason behind such behavior?

最佳答案

这里有不同的比较。

当比较两个列表时,第一个列表中的每个元素通过 == 与另一个列表中的等效元素进行比较,这会调用您的 eq 方法。尽管该方法的代码非常奇怪(为什么不只是 len(self.alias) =​​= len(other.alias)?),它会根据相对大小产生 True 或 False别名属性。

然而集合的工作方式完全不同。比较是通过散列来完成的,而不是通过相等来完成的;并且您已经定义了您的 __hash__ 方法以根据名称而不是别名返回不同的结果。

关于python - python 中集合相等的异常行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43225209/

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