Umkehren / Invertieren einer Wörterbuchzuordnung

Lesezeit: 5 Minuten

Benutzer-Avatar
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


Benutzer-Avatar
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

Benutzer-Avatar
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


1143090cookie-checkUmkehren / Invertieren einer Wörterbuchzuordnung

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy