De set(list_of_objects)
zal de duplicaten alleen verwijderen als u weet wat een duplicaat is, dat wil zeggen dat u de uniciteit van een object moet definiëren.
Om dat te doen, moet je het object hashbaar maken. U moet beide __hash__
. definiëren en __eq__
methode, hier is hoe:
http://docs.python.org/glossary.html#term-hashable
Hoewel u waarschijnlijk alleen __eq__
. hoeft te definiëren methode.
BEWERKEN :Hoe de __eq__
. te implementeren methode:
U moet, zoals ik al zei, de uniciteitsdefinitie van uw object kennen. Stel dat we een boek hebben met de attributen naam auteur en titel waarvan de combinatie uniek is (we kunnen dus veel boeken hebben die Stephen King heeft geschreven en veel boeken met de naam The Shining, maar slechts één boek met de naam The Shining van Stephen King), dan is de implementatie is als volgt:
def __eq__(self, other):
return self.author_name==other.author_name\
and self.title==other.title
Op dezelfde manier implementeer ik soms de __hash__
methode:
def __hash__(self):
return hash(('title', self.title,
'author_name', self.author_name))
U kunt controleren of als u een lijst van 2 boeken met dezelfde auteur en titel maakt, de boekobjecten dezelfde zullen zijn (met gelijk (met is
operator) en==
exploitant). Ook wanneer set()
wordt gebruikt, wordt één boek verwijderd.
BEWERKEN :Dit is een oud antwoord van mij, maar ik merk nu pas dat het de fout bevat die in de laatste alinea is gecorrigeerd met doorhalen:objecten met dezelfde hash()
geeft geen True
vergeleken met is
. Hashability van objecten wordt echter gebruikt als u ze wilt gebruiken als elementen van een set of als sleutels in het woordenboek.