gpt4 book ai didi

Python:使用集合检测重复项

转载 作者:太空狗 更新时间:2023-10-29 21:19:02 26 4
gpt4 key购买 nike

我有大量对象需要存储在内存中以便在 Python 中进行处理。具体来说,我正在尝试从大量对象中删除重复项。如果对象中的某个实例变量相等,我想考虑两个对象“相等”。所以,我假设最简单的方法是将我所有的对象插入一个集合中,并重写 __hash__ 方法,以便它散列我关心的实例变量。

因此,作为测试,我尝试了以下操作:

class Person:
def __init__(self, n, a):
self.name = n
self.age = a

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

def __str__(self):
return "{0}:{1}".format(self.name, self.age)

myset = set()
myset.add(Person("foo", 10))
myset.add(Person("bar", 20))
myset.add(Person("baz", 30))
myset.add(Person("foo", 1000)) # try adding a duplicate

for p in myset: print(p)

在这里,我定义了一个 Person 类,任何两个具有相同 name 变量的 Person 实例都是相等的,无论任何其他实例变量的值。不幸的是,这个输出:

baz:30
foo:10
bar:20
foo:1000

注意 foo 出现了两次,所以这个程序没有注意到重复项。然而表达式 hash(Person("foo", 10)) == hash(Person("foo", 1000))True。那么,为什么这不能正确检测到重复的 Person 对象呢?

最佳答案

你还忘了 define __eq__() .

If a class does not define a __cmp__() or __eq__() method it should not define a __hash__() operation either; if it defines __cmp__() or __eq__() but not __hash__(), its instances will not be usable in hashed collections. If a class defines mutable objects and implements a __cmp__() or __eq__() method, it should not implement __hash__(), since hashable collection implementations require that a object’s hash value is immutable (if the object’s hash value changes, it will be in the wrong hash bucket).

关于Python:使用集合检测重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5979071/

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