gpt4 book ai didi

Python 设置与自定义对象的区别

转载 作者:行者123 更新时间:2023-11-28 17:08:51 24 4
gpt4 key购买 nike

我有两组自定义对象,它们是根据以下字典元组构建的:

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”属性之外,我有一些相同的元素。

然后我定义了以下对象:

class Result:    
def __init__(self, **kwargs):
self.id = kwargs['id']
self.nome = kwargs['name']
self.cognome = kwargs['last']

def __repr__(self):
return 'Result(%s, %s, %s)' %(self.id, self.name, self.last)

def __hash__(self):
# hash must consider the id of the elements, but the id must not be considered when comparison
return hash((self.id, self.name, self.last))

def __eq__(self, other):
if isinstance(other, Result):
# I want comparison to be made considering only name and last
return (self.name, self.last) == (other.name, other.last)
else:
return False

def __ne__(self, other):
return not self.__eq__(other)

如您所见,此对象已准备好在构造函数中接收字典。

现在我定义了一个函数,它从包含字典的元组中返回一组结果对象:

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 不应该在散列中。如果两个元素相等,则它们的哈希值也必须相等:

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

在内部 hash 将值映射到一个桶。具有不同哈希值的元素可能最终会出现在不同的桶中,并且避免在去重(集合)/查询(字典)时被完全比较。

也就是说,有一种更简单的方法可以获得结果,无需涉及 OOP,只需处理数据本身:

dictionaries = tupleOfDicts1 + tupleOfDicts2
unique_values = {(d['name'], d['last']): d for d in dictionaries}.values()

关于Python 设置与自定义对象的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49095223/

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