set(list_of_objects)
удалит дубликаты только в том случае, если вы знаете, что такое дубликат, то есть вам нужно определить уникальность объекта.
Для этого вам нужно сделать объект хешируемым. Вам нужно определить как __hash__
, так и __eq__
метод, вот как:
http://docs.python.org/glossary.html#term-hashable
Хотя вам, вероятно, потребуется только определить __eq__
метод.
РЕДАКТИРОВАТЬ: как реализовать метод __eq__
:
Как я уже упоминал, вам нужно знать определение уникальности вашего объекта. Предположим, у нас есть Книга с атрибутами author_name и title, комбинация которых уникальна (таким образом, у нас может быть много книг, созданных Стивеном Кингом, и много книг с названием «Сияние», но только одна книга под названием «Сияние» Стивена Кинга), затем реализация как следует:
def __eq__(self, other):
return self.author_name==other.author_name\
and self.title==other.title
Точно так же я иногда реализую метод __hash__
:
def __hash__(self):
return hash(('title', self.title,
'author_name', self.author_name))
Вы можете проверить, что если вы создадите список из 2 книг с одинаковым автором и названием, объекты книги будут одинаковыми (с оператором is
) и (с оператором ==
). Кроме того, при использовании set()
будет удалена одна книга.
РЕДАКТИРОВАТЬ: это один из моих старых ответов, но я только сейчас заметил, что в нем есть ошибка, исправленная зачеркиванием в последнем абзаце: объекты с одинаковым hash()
не будут давать True
по сравнению с is
. Однако хэшируемость объектов используется, если вы собираетесь использовать их как элементы набора или как ключи в словаре.
person
vonPetrushev
schedule
13.11.2010