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}
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 items
iteritems
verwenden.
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.
Versuche dies:
my_dict = {2:3, 5:6, 8:9}
new_dict = {}
for k, v in my_dict.items():
new_dict[v] = k
vielleicht:
flipped_dict = dict(Zip(my_dict.values(), my_dict.keys()))
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!
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']}
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()))
my_dict = { my_dict[k]:k for k in my_dict}
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)
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']})