Bei einem Wörterbuch wie diesem:
my_map = {'a': 1, 'b': 2}
Wie kann man diese Karte invertieren, um zu erhalten:
inv_map = {1: 'a', 2: 'b'}
Brian M. Jagd
Bei einem Wörterbuch wie diesem:
my_map = {'a': 1, 'b': 2}
Wie kann man diese Karte invertieren, um zu erhalten:
inv_map = {1: 'a', 2: 'b'}
Angenommen, die Werte im Diktat sind eindeutig:
Python3:
dict((v, k) for k, v in my_map.items())
Python 2:
dict((v, k) for k, v in my_map.iteritems())
Die Werte müssen auch hashbar sein
– John LaRooy
24. Mai 2012 um 1:52 Uhr
@Buttons840: Wenn die Werte nicht eindeutig sind, gibt es sowieso keine eindeutige Invertierung des Wörterbuchs oder mit anderen Worten, eine Invertierung macht keinen Sinn.
– Wrzlprmft
25. Oktober 2014 um 14:13 Uhr
@Buttons840 Nur der letzte Schlüssel wird für den Wert angezeigt. Es gibt wahrscheinlich keine Garantien auf die Bestellung, dass iteritems()
ausgegeben wird, so dass davon ausgegangen werden kann, dass einem nicht eindeutigen Wert ein willkürlicher Schlüssel zugewiesen wird, auf eine Weise, die unter bestimmten Bedingungen anscheinend reproduzierbar ist, aber im Allgemeinen nicht.
– Jewgeni Sergejew
21. April 2015 um 8:13 Uhr
Beachten Sie natürlich, dass es in Python 3 kein mehr gibt iteritems()
Methode und dieser Ansatz wird nicht funktionieren; verwenden items()
dort stattdessen wie in der akzeptierten Antwort gezeigt. Außerdem würde ein Wörterbuchverständnis dies schöner machen als zu telefonieren dict
.
– Mark Amery
16. Juli 2016 um 17:17 Uhr
@Wrzlprmft Bei nicht eindeutigen Werten gibt es eine natürliche Definition für invers. Jeder Wert wird dem Schlüsselsatz zugeordnet, der zu ihm führt.
– Löwe
25. Oktober 2016 um 19:08 Uhr
… oder einfach inv_map.setdefault(v, []).append(k). Früher war ich ein Defaultdict-Fanboy, aber dann wurde ich zu oft verarscht und kam zu dem Schluss, dass eigentlich explizit besser ist als implizit.
– alsuren
10. November 2010 um 14:55 Uhr
Diese Antwort ist für Multi-Map falsch, das Anhängen hier ist nutzlos, da der Wert jedes Mal auf eine leere Liste zurückgesetzt wird, sollte set_default verwenden
– Jaroslaw Bulatow
22. April 2016 um 20:37 Uhr
@YaroslavBulatov nein, der hier gezeigte Code ist nicht defekt – inv_map.get(v, [])
gibt die bereits hinzugefügte Liste zurück, falls vorhanden, sodass die Zuweisung nicht auf eine leere Liste zurückgesetzt wird. setdefault
wäre aber immer noch schöner.
– Mark Amery
16. Juli 2016 um 17:23 Uhr
Hier wäre ein Set sinnvoller. Die Schlüssel sind (wahrscheinlich) hashbar, und es gibt keine Reihenfolge. inv_map.setdefault(v, set()).add(k)
.
– Artyer
11. August 2017 um 17:17 Uhr
Verwenden Sie in Python3 my_map.items()
Anstatt von my_map.iteritems()
.
– apitsch
15. April 2019 um 15:02 Uhr
fs.
Um dies zu tun und dabei den Typ Ihrer Zuordnung beizubehalten (vorausgesetzt, es handelt sich um eine dict
oder ein dict
Unterklasse):
def inverse_mapping(f):
return f.__class__(map(reversed, f.items()))
Es mag clever sein, aber es funktioniert nicht, wenn mehr als ein Schlüssel den gleichen Wert im ursprünglichen Wörterbuch hat.
– Rafael_Espericueta
5. Juni 2018 um 1:02 Uhr
@Rafael_Espericueta Das gilt für jede mögliche Antwort auf diese Frage, da eine Karte mit wiederholten Werten nicht umkehrbar ist.
– Mark Amery
15. Juli 2019 um 1:56 Uhr
@Mark_Amery Es kann in gewissem Sinne allgemeiner invertierbar sein. Zum Beispiel: D = {1: [1, 2]2:[2, 3]3: [1]}, Dinv = {1: [1, 3]2: [1, 2]3: [2]}. D ist beispielsweise ein Wörterbuch von {Eltern: Kinder}, während Dinv das Wörterbuch {Kind: Eltern} ist.
– Rafael_Espericueta
21. Juli 2019 um 23:48 Uhr
Ich glaube nicht, dass es notwendig ist, das zu tun f.__class__
weil Sie bereits davon ausgegangen sind, dass es sich um ein Wörterbuch handelt. Ich würde es so machen: dict(map(reversed, f.items()))
– bkbilly
5. Juli 2020 um 15:34 Uhr
@bkbilly Es wurde keine Annahme getroffen, dass wir ein Diktat haben – nur wir haben eins items
Methode
– Herr_und_Frau_D
27. April 2021 um 9:00 Uhr
Rick unterstützt Monica
Versuche dies:
inv_map = dict(zip(my_map.values(), my_map.keys()))
(Beachten Sie, dass die Python-Dokumentation zu Wörterbuchansichten garantiere das ausdrücklich .keys()
und .values()
haben ihre Elemente in der gleichen Reihenfolge, wodurch der obige Ansatz funktioniert.)
Alternative:
inv_map = dict((my_map[k], k) for k in my_map)
oder die Dikt-Verständnisse von Python 3.0 verwenden
inv_map = {my_map[k] : k for k in my_map}
Es mag clever sein, aber es funktioniert nicht, wenn mehr als ein Schlüssel den gleichen Wert im ursprünglichen Wörterbuch hat.
– Rafael_Espericueta
5. Juni 2018 um 1:02 Uhr
@Rafael_Espericueta Das gilt für jede mögliche Antwort auf diese Frage, da eine Karte mit wiederholten Werten nicht umkehrbar ist.
– Mark Amery
15. Juli 2019 um 1:56 Uhr
@Mark_Amery Es kann in gewissem Sinne allgemeiner invertierbar sein. Zum Beispiel: D = {1: [1, 2]2:[2, 3]3: [1]}, Dinv = {1: [1, 3]2: [1, 2]3: [2]}. D ist beispielsweise ein Wörterbuch von {Eltern: Kinder}, während Dinv das Wörterbuch {Kind: Eltern} ist.
– Rafael_Espericueta
21. Juli 2019 um 23:48 Uhr
Ich glaube nicht, dass es notwendig ist, das zu tun f.__class__
weil Sie bereits davon ausgegangen sind, dass es sich um ein Wörterbuch handelt. Ich würde es so machen: dict(map(reversed, f.items()))
– bkbilly
5. Juli 2020 um 15:34 Uhr
@bkbilly Es wurde keine Annahme getroffen, dass wir ein Diktat haben – nur wir haben eins items
Methode
– Herr_und_Frau_D
27. April 2021 um 9:00 Uhr
Ein anderer, funktionellerer Weg:
my_map = { 'a': 1, 'b':2 }
dict(map(reversed, my_map.items()))
Danke fürs Schreiben. Ich bin mir nicht sicher, ob dies vorzuziehen ist – um Guido Van Rossum in PEP 279 zu zitieren: „filter
und map
sollten sterben und in Listenverständnissen subsumiert werden, nicht mehr Varianten wachsen”.
– Brian M. Jagd
26. Februar 2014 um 16:38 Uhr
Ja, das ist ein fairer Punkt, Brian. Ich habe es nur als Gesprächsthema hinzugefügt. Das Diktatverständnis ist für die meisten besser lesbar, würde ich mir vorstellen. (Und wahrscheinlich auch schneller, würde ich vermuten)
– Brendan Maguire
26. Februar 2014 um 17:10 Uhr
Könnte weniger lesbar sein als andere, aber diese Methode hat den Vorteil, dass sie ausgetauscht werden kann dict
mit anderen Mapping-Typen wie z collections.OrderedDict
oder collections.defaultdict
– Wird S
17. August 2017 um 9:51 Uhr