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}
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
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.
Essaye ça:
my_dict = {2:3, 5:6, 8:9}
new_dict = {}
for k, v in my_dict.items():
new_dict[v] = k
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!
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()))
my_dict = { my_dict[k]:k for k in my_dict}
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)