Ich erhalte ein Wörterbuch als Eingabe und möchte ein Wörterbuch zurückgeben, dessen Schlüssel die Werte der Eingabe und dessen Wert die entsprechenden Eingabeschlüssel sind. Werte sind einzigartig.
Angenommen, meine Eingabe lautet:
a = dict()
a['one']=1
a['two']=2
Ich möchte, dass meine Ausgabe ist:
{1: 'one', 2: 'two'}
Zur Verdeutlichung möchte ich, dass mein Ergebnis dem folgenden entspricht:
res = dict()
res[1] = 'one'
res[2] = 'two'
Gibt es einen ordentlichen pythonischen Weg, um dies zu erreichen?
python
dictionary
Roee Adler
quelle
quelle
Antworten:
Python 2:
Python 3 (danke an @erik):
quelle
[
und]
. Benötigt ein Listenverständnis nicht das[
und]
?quelle
Ab Python 2.7, einschließlich 3.0+, gibt es eine wohl kürzere, besser lesbare Version:
quelle
quelle
Sie können das Diktatverständnis nutzen :
Bearbeitet: Verwenden Sie für Python 3
a.items()
anstelle vona.iteritems()
. Diskussionen über die Unterschiede zwischen ihnen finden Sie in Iteritems in Python on SO.quelle
Du könntest es versuchen:
Beachten Sie, dass Sie ein Wörterbuch nicht "umkehren" können, wenn
{'one':1,'two':1}
. Das neue Wörterbuch kann nur ein Element mit Schlüssel enthalten1
.{'one':[1]}
.[1]
ist ein gültiger Wert, aber kein gültiger Schlüssel.In diesem Thread auf der Python-Mailingliste finden Sie eine Diskussion zu diesem Thema.
quelle
Die aktuell führende Antwort geht davon aus, dass die Werte eindeutig sind, was nicht immer der Fall ist. Was ist, wenn Werte nicht eindeutig sind? Sie verlieren Informationen! Beispielsweise:
kehrt zurück
{2: 'b', 3: 'a'}
.Die Informationen über
'c'
wurden vollständig ignoriert. Idealerweise sollte es so etwas sein{2: ['b','c'], 3: ['a']}
. Dies ist, was die unterste Implementierung tut.Python 2.x.
Python 3.x.
quelle
res = dict(zip(a.values(), a.keys()))
quelle
oder noch besser, funktioniert aber nur in Python 3:
quelle
Eine andere Möglichkeit, die Antwort von Ilya Prokin zu erweitern, besteht darin, die
reversed
Funktion tatsächlich zu verwenden .Im Wesentlichen wird Ihr Wörterbuch durchlaufen (wobei
.items()
), wobei jedes Element ein Schlüssel / Wert-Paar ist, und diese Elemente werden mit derreversed
Funktion ausgetauscht . Wenn dies an dendict
Konstruktor übergeben wird, werden sie in Wert / Schlüssel-Paare umgewandelt, was Sie möchten.quelle
Verbesserungsvorschlag für Javier Antwort:
Anstatt
d.keys()
können Sie nur schreibend
, denn wenn Sie das Wörterbuch mit einem Iterator durchgehen, werden die Schlüssel des entsprechenden Wörterbuchs zurückgegeben.Ex. für dieses Verhalten:
quelle
Kann leicht mit Wörterbuchverständnis gemacht werden:
quelle
.items()
gibt eine Liste von Tupeln von zurück(key, value)
.map()
Durchläuft Elemente der Liste und wendet sielambda x:[::-1]
auf jedes Element (Tupel) an, um sie umzukehren, sodass jedes Tupel(value, key)
in die neue Liste aufgenommen wird, die aus der Karte herausgespuckt wurde. Schließlichdict()
macht ein Diktat aus der neuen Liste.quelle
lambda x:[::-1]
auf jedes ihrer Elemente (Tupel) an, um sie umzukehren, sodass jedes Tupel (Wert, Schlüssel) in der neuen Liste wird, die aus der Karte ausgespuckt wird. Schließlich macht dict () ein Diktat aus der neuen Liste.Verwenden der Schleife : -
quelle
Wenn Sie Python3 verwenden, ist es etwas anders:
quelle
Hinzufügen einer In-Place-Lösung:
In Python3 ist es wichtig, dass Sie verwenden,
list(d.keys())
dadict.keys
eine Ansicht der Schlüssel zurückgegeben wird. Wenn Sie Python2 verwenden,d.keys()
ist dies ausreichend.quelle
Hanans Antwort ist die richtige, da sie einen allgemeineren Fall abdeckt (die anderen Antworten sind für jemanden, der sich der doppelten Situation nicht bewusst ist, irreführend). Eine Verbesserung von Hanans Antwort ist die Verwendung von setdefault:
quelle