1053 Stimmen

Umkehrung / Invertierung einer Wörterbuchzuordnung

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'}

1475voto

SilentGhost Punkte 285785

Python 3+:

inv_map = {v: k for k, v in my_map.items()}

Python 2:

inv_map = {v: k for k, v in my_map.iteritems()}

7 Stimmen

In neueren Python 2.7.x Versionen my_map.items() funktioniert ebenso gut

2 Stimmen

@valentin Ja, das Werke aber es ist weniger effizient, weil es eine Liste von Paaren erzeugt, statt eines Iterators.

77 Stimmen

Das wird funktionieren, aber nicht, wenn die Werte nicht einheitlich sind. In diesem Fall werden Sie einige Einträge verlieren

228voto

Unter der Annahme, dass die Werte im Diktat eindeutig sind:

Python 3:

dict((v, k) for k, v in my_map.items())

Python 2:

dict((v, k) for k, v in my_map.iteritems())

27 Stimmen

Die Werte müssen auch hashfähig sein

36 Stimmen

@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.

2 Stimmen

@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.

202voto

Robert Rossney Punkte 91100

Wenn die Werte in my_map sind nicht einzigartig:

Python 3:

inv_map = {}
for k, v in my_map.items():
    inv_map[v] = inv_map.get(v, []) + [k]

Python 2:

inv_map = {}
for k, v in my_map.iteritems():
    inv_map[v] = inv_map.get(v, []) + [k]

71 Stimmen

... 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.

0 Stimmen

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

2 Stimmen

@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.

54voto

fs. Punkte 878

Um dies unter Beibehaltung des Typs Ihrer Abbildung zu tun (unter der Annahme, dass es sich um eine dict oder eine dict Unterklasse):

def inverse_mapping(f):
    return f.__class__(map(reversed, f.items()))

5 Stimmen

Das mag clever sein, funktioniert aber nicht, wenn mehr als ein Schlüssel den gleichen Wert im ursprünglichen Wörterbuch hat.

10 Stimmen

@Rafael_Espericueta Das gilt für jede mögliche Antwort auf diese Frage, da eine Karte mit wiederholten Werten nicht invertierbar ist.

3 Stimmen

@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.

49voto

sykora Punkte 88704

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}

3 Stimmen

Beachten Sie, dass dies nur funktioniert, wenn die Schlüssel eindeutig sind (was fast nie der Fall ist, wenn Sie sie invertieren wollen).

0 Stimmen

Selon python.org/dev/peps/pep-0274 dict comprehensions sind auch in 2.7+ verfügbar.

CodeJaeger.com

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.

Powered by:

X