Gibt es eine einfachere Möglichkeit, dies in Python (2.7) zu tun?: Hinweis: Dies ist nichts Besonderes, wie das Einfügen aller lokalen Variablen in ein Wörterbuch. Nur die, die ich in einer Liste angegeben habe.
apple = 1
banana = 'f'
carrot = 3
fruitdict = {}
# I want to set the key equal to variable name, and value equal to variable value
# is there a more Pythonic way to get {'apple': 1, 'banana': 'f', 'carrot': 3}?
for x in [apple, banana, carrot]:
fruitdict[x] = x # (Won't work)
python
dictionary
atp
quelle
quelle
Antworten:
for i in ('apple', 'banana', 'carrot'): fruitdict[i] = locals()[i]
quelle
dict([(i, locals()[i]) for i in ('apple', 'banana', 'carrot')])
locals()
anscheinend auf den Umfang des Listenverständnisses hinweist.loc=locals()
zuvor eingestellt habendict([(i, loc[i]) for in ('apple', 'banana', 'carrot')])
.Die
globals()
Funktion gibt ein Wörterbuch zurück, das alle Ihre globalen Variablen enthält.>>> apple = 1 >>> banana = 'f' >>> carrot = 3 >>> globals() {'carrot': 3, 'apple': 1, '__builtins__': <module '__builtin__' (built-in)>, '__name__': '__main__', '__doc__': None, 'banana': 'f'}
Es gibt auch eine ähnliche Funktion namens
locals()
.Mir ist klar, dass dies wahrscheinlich nicht genau das ist, was Sie wollen, aber es kann einen Einblick geben, wie Python den Zugriff auf Ihre Variablen ermöglicht.
Bearbeiten : Es hört sich so an, als ob Ihr Problem besser gelöst werden kann, indem Sie zunächst ein Wörterbuch verwenden:
fruitdict = {} fruitdict['apple'] = 1 fruitdict['banana'] = 'f' fruitdict['carrot'] = 3
quelle
Ein Einzeiler ist: -
fruitdict = dict(zip(('apple','banana','carrot'), (1,'f', '3'))
quelle
Hier steht es in einer Zeile, ohne dass eine der Variablen oder ihre Werte erneut eingegeben werden muss:
fruitdict.update({k:v for k,v in locals().copy().iteritems() if k[:2] != '__' and k != 'fruitdict'})
quelle
Basierend auf der Antwort von mouad können Sie die Variablen anhand eines Präfixes pythonischer auswählen:
# All the vars that I want to get start with fruit_ fruit_apple = 1 fruit_carrot = 'f' rotten = 666 prefix = 'fruit_' sourcedict = locals() fruitdict = { v[len(prefix):] : sourcedict[v] for v in sourcedict if v.startswith(prefix) } # fruitdict = {'carrot': 'f', 'apple': 1}
Sie können dies sogar in eine Funktion mit Präfix und Sourcing-Argument als Argument einfügen.
quelle
Nun, das ist ein bisschen, ähm ... nicht pythonisch ... hässlich ... hackisch ...
Hier ist ein Codeausschnitt, der davon ausgeht, dass Sie ein Wörterbuch aller lokalen Variablen erstellen möchten, die Sie erstellen, nachdem ein bestimmter Prüfpunkt erstellt wurde:
checkpoint = [ 'checkpoint' ] + locals().keys()[:] ## Various local assigments here ... var_keys_since_checkpoint = set(locals().keys()) - set(checkpoint) new_vars = dict() for each in var_keys_since_checkpoint: new_vars[each] = locals()[each]
Beachten Sie, dass wir den 'Checkpoint'-Schlüssel explizit zu unserer Erfassung des hinzufügen.
locals().keys()
Ich nehme auch explizit einen Teil davon, obwohl dies in diesem Fall nicht erforderlich sein sollte, da die Referenz abgeflacht werden muss, um sie dem [' Checkpoint hinzuzufügen ' ] aufführen. Wenn Sie jedoch eine Variante dieses Codes verwenden und versuchen, die['checkpoint'] + portion (because that key was already in
local (), for example) ... then, without the [:] slice you could end up with a reference to the
local (). Keys () `zu verknüpfen, deren Werte sich beim Hinzufügen von Variablen ändern würden.Nebenbei kann ich mir keine Möglichkeit vorstellen, so etwas wie
new_vars.update()
mit einer Liste von Schlüsseln aufzurufen , die hinzugefügt / aktualisiert werden sollen. Diefor
Schleife ist also am tragbarsten. Ich nehme an, dass ein Wörterbuchverständnis in neueren Versionen von Python verwendet werden könnte. Dies scheint jedoch nichts weiter als eine Runde Code-Golf zu sein.quelle
Diese Frage wurde praktisch beantwortet, aber ich wollte nur sagen, dass es lustig war, dass Sie gesagt haben
Weil es eigentlich "schicker" ist
was Sie wollen ist:
apple = 1 banana = 'f' carrot = 3 fruitdict = {} # I want to set the key equal to variable name, and value equal to variable value # is there a more Pythonic way to get {'apple': 1, 'banana': 'f', 'carrot': 3}? names= 'apple banana carrot'.split() # I'm just being lazy for this post items = globals() # or locals() for name in names: fruitdict[name] = items[name]
Ehrlich gesagt, kopieren Sie nur Elemente von einem Wörterbuch in ein anderes.
(Greg Hewgill gab praktisch die ganze Antwort, ich habe sie gerade vervollständigt)
... und wie die Leute vorgeschlagen haben, sollten Sie diese wahrscheinlich zuerst in das Wörterbuch aufnehmen, aber ich gehe davon aus, dass Sie dies aus irgendeinem Grund nicht können
quelle
Versuchen:
to_dict = lambda **k: k apple = 1 banana = 'f' carrot = 3 to_dict(apple=apple, banana=banana, carrot=carrot) #{'apple': 1, 'banana': 'f', 'carrot': 3}
quelle
dict(apple=apple, banana=banana, carrot=carrot)
?Nicht die eleganteste Lösung und funktioniert nur in 90% der Fälle:
def vardict(*args): ns = inspect.stack()[1][0].f_locals retval = {} for a in args: found = False for k, v in ns.items(): if a is v: retval[k] = v if found: raise ValueError("Value found in more than one local variable: " + str(a)) found = True if found: continue if 'self' in ns: for k, v in ns['self'].__dict__.items(): if a is v: retval[k] = v if found: raise ValueError("Value found in more than one instance attribute: " + str(a)) found = True if found: continue for k, v in globals().items(): if a is v: retval[k] = v if found: raise ValueError("Value found in more than one global variable: " + str(a)) found = True assert found, "Couldn't find one of the parameters." return retval
Sie werden auf Probleme stoßen, wenn Sie dieselbe Referenz in mehreren Variablen speichern, aber auch, wenn mehrere Variablen dieselbe kleine int speichern, da diese interniert werden.
quelle
warum machst du nicht das Gegenteil:
fruitdict = { 'apple':1, 'banana':'f', 'carrot':3, } locals().update(fruitdict)
Update:
Verwenden Sie nicht den obigen Code. Überprüfen Sie den Kommentar.
Übrigens, warum du die Vars, die du bekommen willst, nicht markierst, weiß ich vielleicht nicht so:
# All the vars that i want to get are followed by _fruit apple_fruit = 1 carrot_fruit = 'f' for var in locals(): if var.endswith('fruit'): you_dict.update({var:locals()[var])
quelle
locals()
ist wirklich böse.a = "something" randround = {} randround['A'] = "%s" % a
Hat funktioniert.
quelle
{'a' : 'something'}
und Sie bekommen{'A' : 'something'}
... Sie sind schwer, den Schlüssel zu codierenA