Vai ir iebūvēta programma, kas Python programmā noņem saraksta dublikātus, vienlaikus saglabājot secību? Es zinu, ka es varu izmantot kopu, lai noņemtu dubultniekus, bet tas iznīcina sākotnējo kārtību. Es arī zinu, ka varu izveidot savu, piemēram, šādu:
def uniq(input):
output = []
for x in input:
if x not in output:
output.append(x)
return output
(Paldies unwind par šo koda paraugu.)
Bet es gribētu izmantot kādu iebūvētu vai pitoniskāku idiomu, ja iespējams.
Saistīts jautājums: Kāds ir ātrākais algoritms, lai no saraksta noņemtu dubultniekus tā, lai visi elementi būtu unikāli, saglabājot secību?.
Šeit jums ir dažas alternatīvas: http://www.peterbe.com/plog/uniqifiers-benchmark
Ātrākais:
def f7(seq):
seen = set()
seen_add = seen.add
return [x for x in seq if not (x in seen or seen_add(x))]
Kāpēc seen.add
tiek piešķirts seen_add
, nevis vienkārši izsaukt seen.add
? Python ir dinamiska valoda, un seen.add
atrisināšana katrā iterācijā ir dārgāka nekā vietējā mainīgā atrisināšana. seen.add
varētu būt mainījies starp iterācijām, un izpildes laiks nav pietiekami gudrs, lai to izslēgtu. Lai būtu drošs, tam ir jāpārbauda objekts katru reizi.
Ja jūs plānojat šo funkciju bieži izmantot vienai un tai pašai datu kopai, iespējams, labāk būtu izmantot sakārtotu kopu: http://code.activestate.com/recipes/528878/
O(1) ievietošana, dzēšana un locekļu pārbaude katrai operācijai.
(Neliela papildu piezīme: seen.add()
vienmēr atgriež None
, tāpēc iepriekš minētais or
ir tikai kā veids, kā mēģināt atjaunināt kopu, nevis kā loģiskā testa neatņemama sastāvdaļa.))
from itertools import groupby
[ key for key,_ in groupby(sortedList)]
Sarakstam pat nav jābūt sortētam, pietiekams nosacījums ir tas, ka vienādas vērtības ir sagrupētas kopā.
Edit: Es pieņēmu, ka "saglabāt kārtību" nozīmē, ka saraksts ir sakārtots. Ja tas tā nav, tad MizardX piedāvātais risinājums ir pareizais.
Kopienas rediģēšana: Tomēr šis ir viselegantākais veids, kā "saspiest dublējošos secīgos elementus vienā elementā".