Seite 1 von 1

Liste in Dictionary wandeln mit den Keys "0", &

Verfasst: Samstag 22. Februar 2003, 13:59
von Dookie
Hallo zusammen,

Code: Alles auswählen

to_Dict = lambda t: dict(map(None, map(lambda x: str(x), xrange(len(t))), t))
macht aus einer Liste oder einem Tuple ein Dictionary. Benötigt mindestens Python Version 2.2!
Beispiel:

Code: Alles auswählen

>>> to_Dict = lambda t: dict(map(None, map(lambda x: str(x), xrange(len(t))), t))
>>> to_Dict((1,2,3,4,5))
{'1': 2, '0': 1, '3': 4, '2': 3, '4': 5}
>>> 
Kann zum Beispiel verwendet werden um bestimmte Elemente einer Liste in einen String zu übertragen.
Noch ein Beispiel:

Code: Alles auswählen

>>> import time
>>> to_Dict = lambda t: dict(map(None, map(lambda x: str(x), xrange(len(t))), t))
>>> print "Time = %(3)02d:%(4)02d:%(5)02d" % to_Dict(time.localtime())
Time = 13:52:53
>>> 
Ich weiß schon, daß es für die Darstellung von Daum und Uhrzeit als Strings schon interne Funktionen gibt, es ist ja nur ein Beispiel.

Gruß

Dookie

Verfasst: Samstag 22. Februar 2003, 14:23
von Milan
hmm... nen bissl kompliziert und meiner meinung nach überflüssig, weil man doch auf elemente mit liste[elementnummer] genauso zugreifen kann, wie mit deiner Funktion. (ich steig nicht ganz durch deinen Code durch :oops: )

auch verstehe ich nicht, warum du zweimal map nimmst.

Code: Alles auswählen

to_Dict = lambda t: dict(map(None, map(lambda x: str(x), xrange(len(t))), t))
Man könnte doch auch das nehmen, oder ? :?:

Code: Alles auswählen

to_Dict = lambda t: dict(map(lambda x,y: (str(x),y), xrange(len(t)),t))

Verfasst: Samstag 22. Februar 2003, 18:24
von Dookie
Hallo Milan,

na so ganz überflüssig ists wohl nicht. Du hast z.B. eine Tupel ("eins", "zwei", "drei") und willst diese Elemente in einem String aber in geänderter Reihenfolge ausgeben.

Code: Alles auswählen

>>> a = ("eins", "zwei", "drei")
>>> print "%s kommt vor %s, und am Ende kommt %s" % a
eins kommt vor zwei, und am Ende kommt drei
>>> print "%s kommt am schluß, %s in der Mitte undd am Anfang kommt %s" % (a[2],a[1],a[0])
drei kommt am schluß, zwei in der Mitte undd am Anfang kommt eins
>>>
Bei nur 3 Einträgen geht das ja noch, aber wenns mehr werden oder das öfter in einer Anwendung gebraucht wird, ist die Lösung mit der Umwandlung in ein Dictionary sicher eleganter.

Code: Alles auswählen

>>> print "%(2)s kommt vor %(1)s, und am Ende kommt %(0)s" % a
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
TypeError: format requires a mapping
>>>
geht ja leider nicht.
Warum ich da zweimal map verwende, kommt daher, daß ich den Code einzeln getestet und dann zusammengepfriemelt habe. Deine Version ist noch kompakter :)


Gruß

Dookie

Verfasst: Montag 30. Mai 2005, 16:00
von Olliminatore
ab Python 2.3

dict(enumerate(Liste))

geht auch oder?

Verfasst: Montag 30. Mai 2005, 16:46
von Gast
nö, jedenfalls nicht für die obige Anwendung mit den Strings, da dann im Dict als Key eine Zahl steht, jedoch ein String gesucht wird. So gehts:

Code: Alles auswählen

dict((str(i),item) for (i,item) in enumerate(Liste))
#in 2.3: dict([(str(i),item) for (i,item) in enumerate(Liste)])
Edit (Leonidas): Code in Python-Tags gesetzt