it-swarm.com.de

schlüssel und Werte in einem Python-Wörterbuch wechseln

Angenommen, ich habe ein Wörterbuch wie dieses:

my_dict = {2:3, 5:6, 8:9}

Gibt es eine Möglichkeit, die Schlüssel und Werte zu wechseln, um Folgendes zu erhalten:

{3:2, 6:5, 9:8}
35
me45
my_dict2 = dict((y,x) for x,y in my_dict.iteritems())

Wenn Sie Python 2.7 oder 3.x verwenden, können Sie stattdessen ein Wörterbuchverständnis verwenden:

my_dict2 = {y:x for x,y in my_dict.iteritems()}

Bearbeiten

Wie in den Kommentaren von JBernardo erwähnt, müssen Sie für Python 3.x anstelle von itemsiteritems verwenden.

62
GWW

Verwenden Sie diesen Code (trivial modifiziert) aus der akzeptierten Antwort bei Python ein Mapping umkehren/invertieren :

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

Beachten Sie, dass davon ausgegangen wird, dass die Werte im ursprünglichen Wörterbuch eindeutig sind. Andernfalls erhalten Sie im resultierenden Wörterbuch doppelte Schlüssel. Dies ist nicht zulässig. 

Und @wim weist darauf hin, dass die Werte auch hashierbar sind. Siehe das Python-Glossar , wenn Sie nicht sicher sind, was hashable ist und was nicht.

6
Trott

Versuche dies:

my_dict = {2:3, 5:6, 8:9}

new_dict = {}
for k, v in my_dict.items():
    new_dict[v] = k
5
Óscar López

vielleicht:

flipped_dict = dict(Zip(my_dict.values(), my_dict.keys()))

5
aaron

Manchmal gilt die Bedingung, dass alle Werte eindeutig sind, nicht. In diesem Fall werden durch die obigen Antworten doppelte Werte gelöscht.

Im Folgenden werden die Werte, die möglicherweise Duplikate sind, in einer Liste zusammengefasst:

from itertools import count
dict([(a,[list(d.keys())[i] for i,j in Zip(count(), d.values())if j==a in set(d.values())])

Ich bin mir sicher, dass es eine bessere (nicht listenkompatible) Methode gibt, aber ich hatte ein Problem mit den vorherigen Antworten. Ich dachte, ich würde meine Lösung bereitstellen, falls andere einen ähnlichen Anwendungsfall haben. 

P.S. Erwarten Sie nicht, dass das Diktat nach Änderungen am Original ordentlich angeordnet ist! Diese Methode wird nur einmal bei einem statischen Dikt verwendet - Sie wurden gewarnt!

2
Thomas Kimber

Du kannst es so machen:

Funktion:

def inverse_dict(my_dict):
    updated_dict = {}

for i in my_dict:
    updated_dict[my_dict[i]] = [i]

return updated_dict

Main():

def main():
    year = {'day': 15, 'month': 3, 'year': 2019}
    print(inverse_dict(year))

if __== "__main__":
    main()

Ausgang:

{15: ['day'], 3: ['month'], 2019: ['year']}
1
Alon Eilat

Vor allem ist nicht garantiert, dass dies möglich ist, da die Werte eines Wörterbuchs unhashable sein können.

Falls dies nicht der Fall ist, können wir einen funktionalen Ansatz verwenden mit:

reversed_dict = dict(map(reversed, original_dict.items()))
1
my_dict = { my_dict[k]:k for k in my_dict}
1
VladEg

Wenn die Werte nicht eindeutig sind, wird der Schlüsselbereich bei der Konvertierung kollidiert. Am besten halten Sie die Tasten in der Liste, wenn Sie die Orte wechseln

unten behandelt das -

RvsD = dict()
for k,v in MyDict.iteritems():
    RsvD.setdefault(v, []).append(k)
0
mungayree

Wenn Werte im Wörterbuch nicht eindeutig sind, können Sie diesem Wert Schlüssel zuordnen. Hier ein Beispiel, wie es mit defaultdict gemacht wird

from collections import defaultdict


def reverse_dict(data: dict) -> dict:
    rd = defaultdict(list)
    for k, v in data.items():
        rd[v].append(k)
    return rd


if __== "__main__":
    from collections import Counter

    data = "aaa bbb ccc ddd aaa bbb ccc aaa"
    c = Counter(data.split())
    print(c)
    # Counter({'aaa': 3, 'bbb': 2, 'ccc': 2, 'ddd': 1})
    rd = reverse_dict(c)
    print(rd)
    # defaultdict(<class 'list'>, {3: ['aaa'], 2: ['bbb', 'ccc'], 1: ['ddd']})
0
Vlad Bezden