set(list_of_objects)
vil kun fjerne dubletterne, hvis du ved, hvad en duplikat er, dvs. du skal definere en unikhed af et objekt.
For at gøre det skal du gøre objektet hashbart. Du skal definere både __hash__
og __eq__
metode, her er hvordan:
http://docs.python.org/glossary.html#term-hashable
Selvom du sandsynligvis kun behøver at definere __eq__
metode.
REDIGER :Sådan implementeres __eq__
metode:
Du skal, som jeg nævnte, kende unikhedsdefinitionen af dit objekt. Antaget, at vi har en bog med attributterne forfatternavn og titel, hvor deres kombination er unik, (så vi kan have mange bøger, som Stephen King har forfattet, og mange bøger med navnet The Shining, men kun én bog med navnet The Shining af Stephen King), så implementeringen er som følger:
def __eq__(self, other):
return self.author_name==other.author_name\
and self.title==other.title
På samme måde er det sådan, jeg nogle gange implementerer __hash__
metode:
def __hash__(self):
return hash(('title', self.title,
'author_name', self.author_name))
Du kan kontrollere, at hvis du opretter en liste med 2 bøger med samme forfatter og titel, vil bogobjekterne være de samme (med lig (med is
operatør) og==
operatør). Også når set()
er brugt, vil den fjerne én bog.
REDIGER :Dette er en af mine gamle svar, men jeg bemærker først nu, at den har fejlen, som er rettet med gennemstregning i sidste afsnit:objekter med samme hash()
giver ikke True
sammenlignet med is
. Hashability af objekter bruges dog, hvis du har til hensigt at bruge dem som elementer af sæt eller som nøgler i ordbog.