[Python-de] Aus'ner Liste jeden Wert einmal rausfischen....

Rainer Fischbach fischbach at ecs-gmbh.de
Thu Sep 12 11:54:16 EDT 2002


At 22:25 11.09.2002 +0200, you wrote:
>Ich bin heute über folgenden Code-Schnipsel gestolpert, der eine Liste 
>ähnlich wie bei 'uniq' unter *IX eindampft.
>
>uniqValues = reduce(lambda a,b : a.setdefault(b, a), values, {}).keys()
>
>Kann man das wirklich so machen? Eigentlich habe ich da ein komisches 
>Gefühl dabei, weil ja jeder Node im Dictionary mit dem Dictionary selber 
>verknüpft wird. Aber die Performance is richtig gut....

ja, man kann. Mit den Keys im dict ist ja nur eine Referen auf das dict
gespeichert, keine 'physische' Kopie. Das dict selbst via setdefault als
value zu setzen hat ja nur die Aufgabe, das dict jedsmal als Resultat der
Verknüpfung wieder zurück zu bekommen. 

Ein dict zu benutzen, um sich wiederholende Elemente aus einer Liste zu
eliminieren, ist sicher der performanteste Weg und das mit reduce zu machen
die eleganteste ormulierung. Das Verfahren ist, wie man es oft auch in
typischem Lisp-Code nicht rein funktional sondern benutzt einen lokalen
Seiteneffekt auf dem dict, das ohnehin wieder verschwindet. Die klassische
imperative Variante 

dict = {}
for v in values:
   dict.setdefault (v, 1)
uniqValues = dict.keys ()

ist viel weitschweifiger und hat den Nachteil, dass ein dict übrigbleibt,
das eigentlich nur eine transitorische Funktion hat. 

Schöner und konzeptionell klarer als die Variante mit reduce wäre das folgende

uniqValues = set (values).elements2list ()

aber das müsste ja demnächst gehen...

ciao, Rainer

>
>--tf
>
>
>
>_______________________________________________
>Python-de maillist  -  Python-de at starship.python.net
>http://starship.python.net/mailman/listinfo/python-de
>
>
     
    Rainer Fischbach
______________________________________________________

    ECS
    Engineering Consulting & Solutions GmbH
    Muehlstrasse 3
    D-92318  Neumarkt

    Phone:               +49 (0)9181 - 4764-84
    Fax:                 +49 (0)9181 - 4764-50
    Mobile:              +49 (0)171  - 41 41 570
    e-mail:              fischbach at ecs-gmbh.de
    WWW:                 http://www.ecs-gmbh.de
______________________________________________________






More information about the Python-de mailing list