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

holger krekel pyth at devel.trillke.net
Thu Sep 12 00:24:13 EDT 2002


Thomas Fanslau 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....

hmmm... jeder Node im Dictionary mit dem Dictionary selber verknüpft wird....
stimmt wohl, und mir kommt es auch etwas kompliziert vor. Auf jeden Fall
kannst du so nur listen von objekten "uniq" machen, die als
dictionary-key funktionieren.  ich vermute, dass

    dict(zip(values,values)).keys()

es aber auch tut und man nicht so lange drueber nachdenken muss :-)
und es ist wahrscheinlich schneller, weil die schleifen komplett 
C-basiert laufen.  Zumindest fuer kleinere listen. mein loesung
geht natuerlich zweimal ueber die values-liste.  Vielleicht weiss
jemand ne noch elegantere loesung.

Damit es fuer alle arten von Objekten (nicht nur die Immutables wie
strings, ints, etc.) funktioniert, muesstest du noch ne fallback-loesung
haben die mit dem vergleichsoperator arbeitet.  Vielleicht kannst
du auch die Set-klasse, die mit python2.3 eingefuehrt wird, schon
nutzen (cvs etc.).  Da gibts, glaube ich, ein MutableSet, dass fuer
diese Aufgabe perfekt geeignet sein duerfte.  

gruss,

    holger




More information about the Python-de mailing list