[Python-de] Liste uniquify

Mike Müller mmueller at python-academy.de
Fr Nov 11 13:10:06 CET 2011


Am 11.11.2011 12:04, schrieb Berthold Hoellmann:
> Philipp Kraus <philipp.kraus at flashpixx.de> writes:
> 
>> Hallo,
>>
>> ich möchte aus einer Liste Duplikate entfernen. Im Moment mache ich das mit
>> def unique(seq):
>>    keys = {}
>>    for e in seq:
>>        keys[e] = 1
>>    return keys.keys()
>>
>> das Problem dabei ist aber, dass mir dadurch die Reihenfolge der
>> Element verändert wird.
>> Ich möchte gerne folgendes haben, wenn die Liste so aussieht [a, a, b,
>> e, c, g, d, g], soll
>> das Resultant nach dem entfernen von den Duplikaten so aussehen [a, b,
>> e, c, g, d]
>> also immer das erste Auftreten eines Elementes soll erhalten bleiben.
>>
>> Ist ein
>> newlist = []
>> for i in list :
>>     if not i in newlist :
>>        newlist.append(i)
> 
> Vielleicht nicht das effektivste, funktioniert aber auch:
> 
>>>> a = ["a", "a", "b","e", "c", "g", "d", "g"]
>>>> uni=[]
>>>> for i in range(len(a)-1,-1,-1): 
> ...  if a[i] not in a[:i]: uni.insert(0,a[i])
> ... 

Da ist die Original-Variante (direkt darüber) aber wesentlich besser.
Hier wird ja bei jedem Schleifendurchlauf gleich zweimal Speicher
alloziert. Einmal bei bei a[:i] und nochmal bei uni.insert(0,a[i]).
Letzteres muss ist durchaus ein Anti-Pattern, wenn in einer Schleife
genutzt. Dann wenigstens:

uni.append(a[i])

und nach der Schleife:

uni.reverse()

Die Lösung mit einem Set ist aber wesentlich performanter und
meiner Meinung nach auch leichter zu verstehen.
In Python sind die eleganten Lösungen auch bei der Performance oft
(nicht immer) die besseren.
Ich denke die Set-Lösung ist der bevorzugte Weg in Python für
dieses Problem.

Mike




Mehr Informationen über die Mailingliste python-de