Gegeben eine Liste von Variablennamen in Python, wie kann ich eine erstellen ein dictionary mit den Namen der Variablen als Schlüssel (zu den Variablen' Werte)?
Habe ich eine Liste von Variablen-Namen, wie diese:
['foo', 'bar', 'baz']
(Ich hatte ursprünglich gefragt, wie ich konvertiert eine Liste von Variablen. Greg Hewgill Antwort unten).
Wie konvertiere ich diese in ein dictionary, wo die Schlüssel sind die Namen der Variablen als strings, und die Werte sind die Werte der Variablen?
{'foo': foo, 'bar': bar, 'baz': baz}
Nun, bin ich wieder-die Frage, die ich kam mit:
d = {}
for name in list_of_variable_names:
d[name] = eval(name)
Kann das verbessert werden?
Updateantwortet auf die Frage (in einem Kommentar), warum würde ich wollen, dies zu tun:
Oft finde ich mich mit dem % - operator, um Zeichenketten mit ein Wörterbuch der Namen und Werte zu interpolieren. Oft werden die Namen in der Zeichenfolge ist, nur die Namen der lokalen Variablen. So (mit der Antwort unten) ich kann so etwas tun:
message = '''Name: %(name)s
ZIP: %(zip)s
Dear %(name)s,
...''' % dict((x, locals()[x]) for x in ['name', 'zip'])
InformationsquelleAutor der Frage Daryl Spitzer | 2008-10-23
Du musst angemeldet sein, um einen Kommentar abzugeben.
Vergessen filtern
locals()
! Das Wörterbuch, das Sie geben, um die Formatierung der Zeichenkette enthalten darf nicht genutzte Tasten:Mit der neuen f-string-Funktion in Python-3.6, mit
locals()
ist nicht mehr notwendig:InformationsquelleAutor der Antwort
Ihre ursprüngliche Liste
[foo, bar, baz]
nicht enthalten, die variable Namen es nur Elemente enthält, die sich auf die gleiche Werte wie die Variablen, die Sie aufgelistet. Dies ist, weil Sie können zwei verschiedene Variablennamen, die sich auf den gleichen Wert.So, in der Liste selbst nicht enthalten, die Informationen über andere Namen beziehen sich auf die Objekte. Das erste element im array hat den Namen
foo
aber es hat auch den Namena[0]
(vorausgesetzt dein array heißta
). Nach der Ausführung des folgenden codequux
bezieht sich auch auf das gleiche Objekt:Update: Du hast Recht, die Sie verwenden können
eval()
ist, aber seine Verwendung wird im Allgemeinen abgeraten. Python stellt ein besonderes Element mit dem Namen__dict__
die das symbol enthält die Tabelle die für das aktuelle Modul. So können Sie:Dass
import __main__
wenn Ihr code ist in der Unbenannte-Haupt-Modul ist eine Eigenart von Python.InformationsquelleAutor der Antwort Greg Hewgill
Können Sie verwenden, Liste oder generator Verstehens zu bauen, eine Liste von Schlüssel-Wert-Tupeln verwendet, um direkt instanziieren dict. Der beste Weg ist unter:
Darüber hinaus, wenn Sie beispielsweise wissen, dass die Variablen existieren in der lokalen Symboltabelle können Sie sich selbst von der gefährlichen eval, indem der variable, die direkt von einheimischen:
Nach Ihrem letzten update, ich denke, die Antwort unten, ist wirklich, was Sie wollen. Wenn Sie nur dieses für string-expansion mit strings, die du kontrollierst, geben Sie nur locals() direkt auf die string-expansion und es wird cherry-wählen Sie die gewünschten Werte
Wenn jedoch diese strings könnte jemals kommen aus einer externen Quelle (z.B. übersetzungen), als es eine gute Idee, filter einheimischen()
InformationsquelleAutor der Antwort Douglas Mayle
Nicht effizient, aber ohne Berufung auf
eval
:oder
je nachdem, was Sie wollen.
InformationsquelleAutor der Antwort ephemient