Je reçois un dictionnaire en entrée, et je voudrais renvoyer un dictionnaire dont les clés seront les valeurs de l'entrée et dont la valeur sera les clés d'entrée correspondantes. Les valeurs sont uniques.
Par exemple, disons que mon entrée est:
a = dict()
a['one']=1
a['two']=2
J'aimerais que ma sortie soit:
{1: 'one', 2: 'two'}
Pour clarifier, je voudrais que mon résultat soit l'équivalent de ce qui suit:
res = dict()
res[1] = 'one'
res[2] = 'two'
Un moyen pythonique pour y parvenir?
python
dictionary
Roee Adler
la source
la source
Réponses:
Python 2:
Python 3 (merci à @erik):
la source
[
et]
. une compréhension de liste ne nécessite-t-elle pas le[
et]
?la source
À partir de Python 2.7, y compris 3.0+, il existe une version sans doute plus courte et plus lisible:
la source
la source
Vous pouvez utiliser les compréhensions de dict :
Modifié: pour Python 3, utilisez à la
a.items()
place dea.iteritems()
. Des discussions sur les différences entre eux peuvent être trouvées dans les iteritems en Python sur SO.la source
Tu pourrais essayer:
Attention, vous ne pouvez pas «inverser» un dictionnaire si
{'one':1,'two':1}
. Le nouveau dictionnaire ne peut avoir qu'un seul élément avec clé1
.{'one':[1]}
.[1]
est une valeur valide mais pas une clé valide.Voir ce fil sur la liste de diffusion python pour une discussion sur le sujet.
la source
res = dict(zip(a.values(), a.keys()))
la source
La réponse principale actuelle suppose que les valeurs sont uniques, ce qui n'est pas toujours le cas. Et si les valeurs ne sont pas uniques? Vous perdrez des informations! Par exemple:
revient
{2: 'b', 3: 'a'}
.Les informations sur ont
'c'
été complètement ignorées. Idéalement, cela devrait être quelque chose comme{2: ['b','c'], 3: ['a']}
. C'est ce que fait l'implémentation du bas.Python 2.x
Python 3.x
la source
ou encore mieux, mais ne fonctionne qu'en Python 3:
la source
Une autre façon de développer la réponse d' Ilya Prokin est d'utiliser réellement la
reversed
fonction.En substance, votre dictionnaire est itéré par (en utilisant
.items()
) où chaque élément est une paire clé / valeur, et ces éléments sont échangés avec lareversed
fonction. Lorsque cela est passé audict
constructeur, il les transforme en paires valeur / clé, ce que vous voulez.la source
Suggestion d'amélioration pour la réponse de Javier:
Au lieu de
d.keys()
vous pouvez écrire simplementd
, car si vous parcourez le dictionnaire avec un itérateur, il renverra les clés du dictionnaire pertinent.Ex. pour ce comportement:
la source
Peut être fait facilement avec la compréhension du dictionnaire:
la source
.items()
renvoie une liste de tuples de(key, value)
.map()
parcourt les éléments de la liste et appliquelambda x:[::-1]
à chacun son élément (tuple) pour l'inverser, de sorte que chaque tuple devient(value, key)
dans la nouvelle liste crachée hors de la carte. Enfin,dict()
crée un dict à partir de la nouvelle liste.la source
lambda x:[::-1]
à chacun son élément (tuple) pour l'inverser, de sorte que chaque tuple devient (valeur, clé) dans la nouvelle liste crachée de map. Enfin, dict () crée un dict à partir de la nouvelle liste.Utilisation de la boucle : -
la source
Si vous utilisez Python3, c'est légèrement différent:
la source
Ajout d'une solution sur place:
Dans Python3, il est essentiel que vous l'utilisiez
list(d.keys())
cardict.keys
renvoie une vue des clés. Si vous utilisez Python2, celad.keys()
suffit.la source
La réponse de Hanan est la bonne car elle couvre un cas plus général (les autres réponses sont un peu trompeuses pour quelqu'un qui n'est pas au courant de la situation en double). Une amélioration de la réponse de Hanan est l'utilisation de setdefault:
la source