web-dev-qa-db-fra.com

changement de clés et de valeurs dans un dictionnaire en python

Dis que j'ai un dictionnaire comme celui-ci:

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

Est-il possible de changer les clés et les valeurs pour obtenir:

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

Si vous utilisez python 2.7 ou 3.x, vous pouvez utiliser un dictionnaire de compréhension:

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

Modifier

Comme indiqué dans les commentaires de JBernardo, pour python 3.x, vous devez utiliser items au lieu de iteritems

62
GWW

Utilisez ce code (modifié trivialement) à partir de la réponse acceptée à Python reverse/invert un mappage :

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

Notez que cela suppose que les valeurs du dictionnaire d'origine sont uniques. Sinon, vous obtiendriez des clés en double dans le dictionnaire résultant, ce qui n'est pas autorisé. 

Et, comme @wim le souligne, cela suppose également que les valeurs sont hashable. Voir le glossaire Python si vous n'êtes pas sûr de ce qui est lavable ou non.

6
Trott

Essaye ça:

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

Parfois, la condition selon laquelle toutes les valeurs sont uniques ne sera pas remplie, auquel cas les réponses ci-dessus détruiront les valeurs dupliquées.

Les éléments suivants convertissent les valeurs pouvant être dupliquées dans une liste:

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())])

Je suis sûr qu'il existe une meilleure méthode (non list-comp), mais j'avais un problème avec les réponses précédentes, donc je pensais fournir ma solution au cas où d'autres utilisateurs auraient un cas d'utilisation similaire. 

P.S. Ne vous attendez pas à ce que le dict reste ordonné après toute modification de l'original! Cette méthode est une utilisation unique sur un dict statique - vous avez été prévenu!

2
Thomas Kimber

Tout d’abord, c’est non garanti que cela soit possible, car les valeurs d’un dictionnaire peuvent être trop lourdes.

Dans le cas contraire, nous pouvons utiliser une approche fonctionnelle avec:

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

Si les valeurs ne sont pas uniques, cela entraînera une collision de l'espace clé en conversion. Le mieux est de garder les clés dans la liste lors du changement de lieu

ci-dessous gère cela -

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