2016-10-02 1 views
0

Ich möchte ziemlich regelmäßig zu einem Wörterbuch, wo die Schlüsselnamen die Variablennamen sind. Zum Beispiel, wenn ich die Variablen a und b dann ein Wörterbuch haben {"a":a, "b":b} (in der Regel Daten am Ende einer Funktion zurückgeben).Erstellen Sie ein Wörterbuch, wo Schlüssel Variablennamen sind

Gibt es (idealerweise eingebaute) Wege in Python dies automatisch zu tun? das heißt, eine Funktion zu haben, so dass create_dictionary(a,b) kehrt {"a":a, "b":b}

+0

' "a": a' nicht viel Sinn macht,' a' gehen wird durch seinen Wert ersetzt werden. –

+1

Zwar gibt es sicherlich Möglichkeiten, dies zu tun (mit 'Locals()'), aber ich denke, das ist sehr selten eine gute Lösung. In dem Beispiel, das Sie angegeben haben (Rückgabe mehrerer Werte aus einer Funktion), ziehen Sie in Betracht, ein 'namedtuple' aus dem Auflistungsmodul zurückzugeben. – flornquake

+1

Wenn Sie regelmäßig das Gefühl haben, dass Sie das brauchen, dann machen Sie ziemlich regelmäßig etwas falsch. –

Antwort

0

Haben Sie versucht, so etwas wie:

a, b, c, d = 1, 2, 3, 4 
dt = {k:v for k, v in locals().items() if not k.startswith('__')} 
print(dt) 
{'a': 1, 'd': 4, 'b': 2, 'c': 3} 
0

Sie können Ihre eigene Funktion für create_dict

def create_dict(*args): 
    return dict({i:eval(i) for i in args}) 

a = "yo" 
b = 7 
print (create_dict("a", "b")) 

schreiben Welche {'a': 'yo', 'b': 7} Ausgang gibt.
Hier ist ein einfacher Generator für das gleiche:

vars = ["a", "b"] 
create_dict = {i:eval(i) for i in args} 

oder Sie können diese Einzeiler Lambda-Funktion

create_dict = lambda *args: {i:eval(i) for i in args} 
print (create_dict("a", "b")) 

verwenden, aber wenn Sie die Variablen an die Funktion anstelle der Variablennamen übergeben als String, dann ist es ziemlich chaotisch, den Namen der Variablen tatsächlich als String zu erhalten. Aber wenn das der Fall ist, dann sollten Sie wahrscheinlich locals() versuchen verwenden, vars(), globals() und werden von Nf4r

+0

["Verwendet Eval in Python eine schlechte Praxis?"] (Http://stackoverflow.com/questions/1832940/is-using-eval-in-python-a-bad-practice), normalerweise 'eval' sollte nicht das richtige Werkzeug sein. –

+0

ist in diesem Fall überhaupt kein Problem. –

+0

Beachten Sie, dass ** literal ** eval nicht einmal funktioniert, da Namen keine Literale sind. –

0

Haben Sie darüber nachgedacht, eine Klasse zu erstellen? Eine Klasse kann als Wrapper für ein Wörterbuch angesehen werden.

# Generate some variables in the workspace 
a = 9; b = ["hello", "world"]; c = (True, False) 

# Define a new class and instantiate 
class NewClass(object): pass 
mydict = NewClass() 

# Set attributes of the new class 
mydict.a = a 
mydict.b = b 
mydict.c = c 

# Print the dict form of the class 
mydict.__dict__ 
{'a': 9, 'b': ['hello', 'world'], 'c': (True, False)} 

Oder Sie könnten die setattr Funktion verwenden, wenn Sie eine Liste von Variablennamen übergeben wollte:

mydict = NewClass() 
vars = ['a', 'b', 'c'] 
for v in vars: 
    setattr(mydict, v, eval(v)) 

mydict.__dict__ 
{'a': 9, 'b': ['hello', 'world'], 'c': (True, False)} 
Verwandte Themen