當我運行這行代碼,我不明白爲什麼這兩個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文檔如果第一組的每個元素都在第二組中,則兩組相等,反之亦然。按照這個定義,這兩個集合應該是平等的,但我不確定它們爲什麼不是。
因此,我想知道這種行爲背後的原因?
什麼是'd'和'e'?你是不是指'field_list1'和'field_list2'? –
'field1'具有''Field 1「,」Field 2「,」Field 3「'作爲'Field'對象的'name'屬性。但是field2有''Field 1','Field 21','Field 3''。那些不一樣。 –
如果您想查找彼此的別名的可傳遞字段組,可以考慮使用[union-find或disjoint set algorithm](https://en.wikipedia.org/wiki/Disjoint-set_data_structure)。 –