[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