2017-04-25 7 views
1

Ich habe ein Wörterbuch als solche:Phantasie Wörterbuch Auspacken

test = {'tuple':(1, 2, 3, 4), 'string':'foo', 'integer':5} 

Um verschwendeten Platz zu halten, würde ich diese Werte in einzelne Variablen entpacken möchten. Ich weiß, dass es möglich ist, die Schlüssel eines Wörterbuchs zu entpacken:

>>> a, b, c = test 
>>> print(a, b, c) 
tuple string integer 

Aber was ich möchte ist zu tun, um die Wörterbuch-Werte entpacken. Irgendetwas wie das:

>>> tuple, string, integer = test 
>>> print(tuple, string, integer) 
(1, 2, 3, 4) string 5 

Ist das möglich? Wenn nicht, denke ich, wenn die entpackten Variablen den Werten innerhalb des Wörterbuchs entsprechen, sollten sie die Werte in die entsprechende Variable entpacken (wie oben gezeigt).

Oder ist mein einziger Weg, dies zu tun ist, wie dies

>>> tuple, string, integer = test['tuple'], test['string'], test['integer'] 
+0

Wenn jemand daran denkt, 'Locals(). Update' zu ​​empfehlen, nein, das funktioniert nicht. – user2357112

+2

Beachten Sie auch, dass Pre-Python 3.6-Dicts ungeordnet sind, und selbst in Python 3.6 ist das Ordering offiziell ein Implementierungsdetail, und das Diktat wurde möglicherweise nicht in der von Ihnen erwarteten Reihenfolge erstellt. – user2357112

+3

http://stackoverflow.com/questions/2597278/python-load-variables-in-a-dict-into-namespace möglich duplizieren – Serge

Antwort

0

die Annahme, dass die Anzahl der Tasten auf der dict statisch ist ?: können Sie es mit values() zuerst abrufen und dann zu Vars zuweisen:

>>> tuple, string, integer = test.values() 
>>> print(tuple, string, integer) 
(1, 2, 3, 4) foo 5 

Weitere Informationen in https://docs.python.org/3.6/library/stdtypes.html#dict

Edit: sagte Wie in den Kommentaren, python in Schlüssel garantieren, um nicht so, eine bessere Lösung:

>>> for key in test: 
     globals()[key] = test[key] 
>>> print(tuple, string, integer) 
(1, 2, 3, 4) foo 5 

Auch dies löst das Problem mit variablen dict Längen.

+3

Dies kann den richtigen Variablen nicht die richtigen Werte zuweisen. – user2357112

+0

Vor Python 3.6 gibt es absolut keine Garantie, dass die 'values ​​()' korrekt sortiert werden. '{'tuple' :(1, 2, 3, 4), 'string': 'foo', 'ganze Zahl': 5} .values ​​() # [5, 'foo', (1, 2, 3 , 4)] ' – julienc

+0

Es gibt jetzt auch keine Garantie. Es ist ein * Implementierungsdetail *. –

0

Iforder kein Problem ist, dass Sie die folgende verwenden:

test = {'tuple':(1, 2, 3, 4), 'string':'foo', 'integer':5} 

print([test[x] for x in test.keys()]) 

Beachten Sie, dass dies gibt eine Liste, wenn Sie es in dem Format, das Sie zeigte sein wollen, bevor Sie nutzen könnten:

test = {'tuple':(1, 2, 3, 4), 'string':'foo', 'integer':5} 

print(' '.join([str(test[x]) for x in test.keys()])) 

Und natürlich, wenn Reihenfolge wichtig ist, könnten Sie eine sortierte Liste von test.keys() machen und darüber iterieren, zB unter Verwendung von sorted(test.keys()).

Viel Glück! Bearbeiten

:

inty, stringy, tuply = [test[x] for x in sorted(test.keys())] 

Würde das gewünschte Ergebnis in diesem Fall ergeben, aber beachten Sie, dass mehrere Tasten Hinzufügen könnte die Reihenfolge ändern!

1

Sie verwenden eine Version von Python Unter der Annahme, früher als 3.6 sortieren, nur die Werte mit den Tasten, dann entpacken in alphabetischer Reihenfolge ...

integer, string, tup = [i[1] for i in sorted(test.items(), key=lambda x: x[0])] 

Dann, auch wenn Sie mehr Schlüssel hinzufügen, müssen Sie nur noch zu erinnern die alphabetische Ordnung, obwohl ich nicht sehen kann, wie praktisch dieser Ansatz über nur mit dem dict wäre

+0

Beats Optionen, die eine Diktierreihenfolge annehmen, aber Sie müssen daran denken, überall alphabetisch zu verwenden und sich daran zu erinnern, ob "A" vor oder nach "b" steht und ob "a1" vor oder nach "kommt" "ab". – user2357112

+0

@ user2357112 überprüfen Sie den letzten Satz in meiner Antwort –

0

Was ich entschieden haben auf tun, ist einfach:

tuple, string, integer = [test[x] for x in ('tuple', 'string', 'integer')] 

Es räumt alles für mich auf und kommt mir nahe.

Immer noch denken, dass tuple, string, integer = **test (wie von @ user2357112 vorgeschlagen) sollte eine Sache sein. Das macht sehr viel Sinn für mich.