Finnes det en innebygd funksjon som fjerner duplikater fra en liste i Python, samtidig som rekkefølgen bevares? Jeg vet at jeg kan bruke et sett til å fjerne duplikater, men det ødelegger den opprinnelige rekkefølgen. Jeg vet også at jeg kan lage min egen slik:
def uniq(input):
output = []
for x in input:
if x not in output:
output.append(x)
return output
(Takk til unwind for dette kodeeksemplet.)
Men jeg vil gjerne benytte meg av et innebygd eller mer pythonsk idiom hvis det er mulig.
Relatert spørsmål: I Python, hva er den raskeste algoritmen for å fjerne duplikater fra en liste slik at alle elementene er unike samtidig som rekkefølgen bevares?.
Her har du noen alternativer: http://www.peterbe.com/plog/uniqifiers-benchmark>
Den raskeste:
def f7(seq):
seen = set()
seen_add = seen.add
return [x for x in seq if not (x in seen or seen_add(x))]
Hvorfor tilordne seen.add
til seen_add
i stedet for bare å kalle seen.add
? Python er et dynamisk språk, og det er mer kostbart å løse opp seen.add
for hver iterasjon enn å løse opp en lokal variabel. seen.add
kan ha endret seg mellom iterasjonene, og kjøretiden er ikke smart nok til å utelukke det. For å være på den sikre siden må den sjekke objektet hver gang.
Hvis du planlegger å bruke denne funksjonen mye på samme datasett, er det kanskje bedre å bruke et ordnet sett: http://code.activestate.com/recipes/528878/
O(1) innsetting, sletting og medlemssjekk per operasjon.
(En liten tilleggsmerknad: seen.add()
returnerer alltid None
, så eller
ovenfor er der bare som en måte å forsøke å oppdatere et sett på, og ikke som en integrert del av den logiske testen).
from itertools import groupby
[ key for key,_ in groupby(sortedList)]
Listen trenger ikke engang å være sortert, den tilstrekkelige betingelsen er at like verdier grupperes sammen.
**Redigering: Jeg antok at "bevare rekkefølgen" innebærer at listen faktisk er sortert. Hvis dette ikke er tilfelle, er løsningen fra MizardX den riktige.
Community edit: Dette er imidlertid den mest elegante måten å "komprimere dupliserte fortløpende elementer til ett enkelt element".