Python: обнаружение дубликатов с помощью набора

У меня есть большое количество объектов, которые мне нужно сохранить в памяти для обработки в 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 ?

7
задан Channel72 12 May 2011 в 13:54
поделиться