У меня есть большое количество объектов, которые мне нужно сохранить в памяти для обработки в Python. В частности, я пытаюсь удалить дубликаты из большого набора объектов. Я хочу считать два объекта «равными», если определенная переменная экземпляра в объекте равна. Так, Я предположил, что самый простой способ сделать это - вставить все мои объекты в набор и переопределить метод __ hash __
, чтобы он хешировал переменную экземпляра, которая меня интересует.
Итак, как test Я пробовал следующее:
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
, и любые два экземпляра Person
с той же переменной name
должны быть равны независимо от значения любой другой переменной экземпляра. К сожалению, это выводит:
baz:30
foo:10
bar:20
foo:1000
Обратите внимание, что foo
появляется дважды, поэтому эта программа не смогла обнаружить дубликаты. Тем не менее, выражение hash (Person ("foo", 10)) == hash (Person ("foo", 1000))
равно True
. Так почему не Чтобы правильно определить повторяющиеся объекты Person
?