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

Code-Stücke können hier veröffentlicht werden.
Antworten
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

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
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

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))
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

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
Olliminatore

ab Python 2.3

dict(enumerate(Liste))

geht auch oder?
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
Antworten