Gegeben ein Wörterbuch wie dieses:
my_map = {'a': 1, 'b': 2}
Wie kann man diese Karte umkehren, um zu erhalten:
inv_map = {1: 'a', 2: 'b'}
Gegeben ein Wörterbuch wie dieses:
my_map = {'a': 1, 'b': 2}
Wie kann man diese Karte umkehren, um zu erhalten:
inv_map = {1: 'a', 2: 'b'}
@valentin Ja, das Werke aber es ist weniger effizient, weil es eine Liste von Paaren erzeugt, statt eines Iterators.
Das wird funktionieren, aber nicht, wenn die Werte nicht einheitlich sind. In diesem Fall werden Sie einige Einträge verlieren
@Buttons840: Wenn die Werte nicht eindeutig sind, gibt es ohnehin keine eindeutige Invertierung des Wörterbuchs oder, mit anderen Worten, eine Invertierung macht keinen Sinn.
@Buttons840 Für den Wert wird nur die letzte Taste angezeigt. Es gibt wahrscheinlich keine Garantien für die Reihenfolge, in der iteritems()
ausgibt, so dass davon ausgegangen werden kann, dass ein beliebiger Schlüssel für einen nicht eindeutigen Wert zugewiesen wird, und zwar in einer Weise, die unter bestimmten Bedingungen scheinbar reproduzierbar ist, aber nicht im Allgemeinen.
... oder einfach inv_map.setdefault(v, []).append(k). Früher war ich ein Defaultdict-Fanboy, aber dann wurde ich einmal zu oft verarscht und kam zu dem Schluss, dass explizit besser ist als implizit.
Diese Antwort ist falsch für Multi-Map, append hier ist nutzlos, weil der Wert auf leere Liste jedes Mal zurückgesetzt wird, sollte set_default verwenden
@YaroslavBulatov nein, der Code, wie er hier gezeigt wird, ist nicht defekt - inv_map.get(v, [])
gibt die bereits hinzugefügte Liste zurück, wenn es eine gibt, damit die Zuweisung nicht auf eine leere Liste zurückgesetzt wird. setdefault
wäre aber immer noch hübscher.
Das mag clever sein, funktioniert aber nicht, wenn mehr als ein Schlüssel den gleichen Wert im ursprünglichen Wörterbuch hat.
@Rafael_Espericueta Das gilt für jede mögliche Antwort auf diese Frage, da eine Karte mit wiederholten Werten nicht invertierbar ist.
@Mark_Amery Sie kann in gewissem Sinne allgemeiner umkehrbar sein. Zum Beispiel: D = {1: [1, 2], 2:[2, 3], 3: [1]}, Dinv = {1: [1, 3], 2: [1, 2], 3: [2]}. D ist ein Wörterbuch von zum Beispiel {Eltern: Kinder}, während Dinv das Wörterbuch {Kind: Eltern} ist.
Versuchen Sie dies:
inv_map = dict(zip(my_map.values(), my_map.keys()))
(Beachten Sie, dass die Python-Dokumente über Wörterbuchansichten ausdrücklich garantieren, dass .keys()
y .values()
haben ihre Elemente in der gleichen Reihenfolge, so dass der obige Ansatz funktionieren kann).
Alternativ dazu:
inv_map = dict((my_map[k], k) for k in my_map)
oder mit den Diktat-Verständnissen von Python 3.0
inv_map = {my_map[k] : k for k in my_map}
Beachten Sie, dass dies nur funktioniert, wenn die Schlüssel eindeutig sind (was fast nie der Fall ist, wenn Sie sie invertieren wollen).
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.