我有两组自定义对象,它们是从以下字典元组构建的:
tupleOfDicts1 = ({'id': 1, 'name': 'peter', 'last': 'smith'},
{'id': 2, 'name': 'peter', 'last': 'smith'},
{'id': 3, 'name': 'mark', 'last':'white'},
{'id': 4, 'name': 'john', 'last': 'lennon'},)
tupleOfDicts2 = ({'id': 9, 'name': 'peter', 'last': 'smith'},
{'id': 8, 'name': 'peter', 'last': 'smith'},)
如您所见,我有相同的元素,除了'id'属性。在
然后我定义以下对象:
^{pr2}$如您所见,此对象已准备好接收构造函数中的字典。在
现在我定义了一个函数,它从包含字典的元组返回一组结果对象:
def getSetFromTuple(tupleOfDicts):
myset = set()
for dictionary in tupleOfDicts:
myset.add(Result(**dictionary))
return myset
此时,我创建了两个集合:
mySet1 = getSetFromTuple(tupleOfDicts1)
mySet2 = getSetFromTuple(tupleOfDicts2)
我这样做是因为我想在mySet1上拥有mySet2上没有的所有元素(对于这个比较,我不希望涉及属性'id'):
diff = mySet1 - mySet2
但我没有得到我想要的,在这种情况下,我得到了mySet1的所有元素:
print(len(mySet1 - mySet2)) # 4
我希望mySet1只剩下两个元素,因为它的两个元素在mySet2上(使用相同的name
和相同的last
,id
总是不同的)。在
在我看来,当我在两个集合之间调用-
运算符时,这个类将比较元素的哈希值。在这种情况下,4的输出是有意义的。但是:有没有办法做我想做的事?在
与您的评论相反,我认为
id
不应该在哈希中。如果两个元素相等,它们的哈希值也必须相等:在内部,
hash
将值映射到一个bucket。具有不同哈希值的元素可能会在不同的bucket中结束,并且在消除重复(集合)/查询(字典)时避免完全比较。在也就是说,有一种更简单的方法来获得结果,而不涉及OOP,只处理数据本身:
^{pr2}$相关问题 更多 >
编程相关推荐