[Python-de] Liste uniquify

Armin Stroß-Radschinski developer at acsr.de
Fr Nov 11 14:46:39 CET 2011


Hallo zusammen,
mal eine Frage aus der Sicht eines eher konzeptionellen  
Datenjongleurs, der die Eleganz von Python in diesem Fall greifen  
möchte.

An den Starter: Welche Art und Mengen von Daten steckt den in den  
Platzhaltern, über die hier performanz- und eleganzorientiert  
diskutiert wird?

An die Coder/Kenner:
Kann Python das so hübsch abstrahieren, dass man auf die Betrachtung  
verzichten kann?
Die Listenverarbeitung in Python wird ja immer gerühmt. Compiler  
Puristen werden da Interpreter skeptisch begegnen, das ist aber nicht  
zwingend richtig.

Ich habs da schon mal mit etwas dickeren Fischen zu tun und arbeite  
aber eher mit allem was juckt und kratzt (eher keine eigenen Python  
Routinen, sondern Code Modifikation woauchimmer).

Konkret wären bei uns z.B. Listen aus Phrasen oder Paragraphen (bzw.  
Sequenzen um im Science Bereich zu bleiben). Hier würde natürlich ggf.  
lediglich der Hash verglichen. Der müsste dann vorliegen oder on the  
fly verfügbar sein. Dann liegt vermutlich das (Perfomanz-) Problem  
sowieso woanders.

Wem das zu sehr Off-Topic ist, bitte gerne ignorieren. Wenn es  
überzeugend ausfällt würde ich es ggf. ins Marketing Konzept für  
Python einbauen ;-)

"simplify unify"

LG Armin

Am 11.11.2011 um 13:10 schrieb Mike Müller:

> 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
>
>
> _______________________________________________
> python-de maillist  -  python-de at python.org
> http://mail.python.org/mailman/listinfo/python-de



--
Armin Carl Stroß-Radschinski, Dipl. Designer
acsr industrialdesign, Landgrafenstraße 32, 53842 Troisdorf, Germany

Telefon +49 (0) 22 41 / 94 69 94, FAX +49 (0) 22 41 / 94 69 96
eMail a.stross-radschinski at acsr.de - http://www.acsr.de
UST. ID Nr: DE154092803 (EU VAT ID)






Mehr Informationen über die Mailingliste python-de