set(list_of_objects)
usunie duplikaty tylko wtedy, gdy wiesz, co to jest duplikat, to znaczy, że musisz zdefiniować unikalność obiektu.
Aby to zrobić, musisz sprawić, by obiekt był haszowalny. Musisz zdefiniować oba __hash__
i __eq__
metoda, oto jak:
http://docs.python.org/glossary.html#term-hashable
Chociaż prawdopodobnie będziesz musiał tylko zdefiniować __eq__
metoda.
EDYTUJ :Jak zaimplementować __eq__
metoda:
Musisz znać, jak wspomniałem, definicję niepowtarzalności swojego obiektu. Załóżmy, że mamy Księgę z atrybutami nazwisko_autora i tytuł, których połączenie jest unikalne (więc możemy mieć wiele książek autorstwa Stephena Kinga i wiele książek o nazwie Lśnienie, ale tylko jedną książkę pod tytułem Lśnienie autorstwa Stephena Kinga), a następnie implementacja wygląda następująco:
def __eq__(self, other):
return self.author_name==other.author_name\
and self.title==other.title
Podobnie, w ten sposób czasami implementuję __hash__
metoda:
def __hash__(self):
return hash(('title', self.title,
'author_name', self.author_name))
Możesz sprawdzić, czy jeśli utworzysz listę 2 książek o tym samym autorze i tytule, obiekty książki będą takie same (z równe (z is
operatora) i==
operator). Również, gdy set()
zostanie użyty, usunie jedną książkę.
EDYTUJ :To jedna z moich starych odpowiedzi, ale dopiero teraz zauważyłem, że zawiera błąd, który został poprawiony przez przekreślenie w ostatnim akapicie:obiekty z tym samym hash()
nie da True
w porównaniu z is
. Hashability obiektu jest jednak używane, jeśli zamierzasz używać ich jako elementów zestawu lub jako kluczy w słowniku.