Python: le Meilleur Moyen d'Échanger des Clés avec des Valeurs dans un Dictionnaire?
Je reçois un dictionnaire comme entrée, et souhaitez retourner un dictionnaire dont les clés seront la saisie de valeurs et dont la valeur sera le correspondant de touches d'entrée. Les valeurs sont uniques.
Par exemple, dire que mon entrée est:
a = dict()
a['one']=1
a['two']=2
Je voudrais que mon sortie:
{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'
Toute soigné Pythonian façon d'atteindre cet objectif?
Grâce
- Voir stackoverflow.com/questions/1087694/... pour une question identique qui a une belle réponse si vous êtes à l'aide de Python 3
- voir la deuxième plus voté réponse, c'est le même que l'reconnus dans la question que vous avez lié. La foule préféré l'autre réponse que...
- Python n'est pas perl, python n'est pas ruby. La lisibilité des comptes. Incomplet est mieux que dense. Ceci étant, toutes les méthodes de ces réponses sont tout simplement mauvais™, l'un dans la question, la meilleure façon d'aller.
- double possible de Python inverse / l'inverse d'un mapping
Vous devez vous connecter pour publier un commentaire.
Python 2:
Python 3 (merci à @erik):
res = {v:k for k,v in a.items()}
.[
et]
. ne une compréhension de liste nécessite pas la[
et]
?De Python 2.7, y compris 3.0+, il y a sans doute plus court, plus lisible version:
Vous pouvez faire usage de dict des compréhensions:
Édité: Pour Python 3, utilisation
a.items()
au lieu dea.iteritems()
. Les Discussions sur les différences entre eux peuvent être trouvés dans iteritems en Python sur DONC.Vous pourriez essayer:
Méfiez-vous que vous ne pouvez pas "renverser" un dictionnaire si
{'one':1,'two':1}
. Le nouveau dictionnaire ne peut avoir qu'un élément avec la clé1
.{'one':[1]}
.[1]
est une valeur valide, mais pas une clé valide.Voir ce fil sur le python liste de diffusion pour une discussion sur le sujet.
ou encore mieux, mais ne fonctionne qu'en Python 3:
res = dict(zip(a.values(), a.keys()))
Une autre façon de développer sur Ilya Prokinla réponse est d'utiliser effectivement le
reversed
fonction.En substance, votre dictionnaire est itérer (à l'aide de
.items()
) où chaque élément est une paire clé/valeur, et ces éléments sont échangé avec lereversed
fonction. Quand c'est passé à ladict
constructeur, il les convertit en valeur/paires de clés qui est ce que vous voulez.Actuellement, la principale réponse prend les valeurs sont uniques, ce qui n'est pas toujours le cas. Si les valeurs ne sont pas uniques? Vous perdrez de l'information!
Par exemple:
retourne
{2: 'b', 3: 'a'}
.Les informations sur
'c'
a été complètement ignorée.Idéalement, il devrait être quelque chose comme
{2: ['b','c'], 3: ['a']}
. C'est ce que le bas de la mise en œuvre n'.Suggestion d'amélioration pour Javier réponse :
Au lieu de
d.keys()
vous pouvez écrire toutd
, parce que si vous allez par le biais de dictionnaire avec un itérateur, il sera de retour les clés du dictionnaire pertinent.Ex. pour ce problème :
.items()
renvoie une liste de tuples de(key, value)
.map()
passe par les éléments de la liste et s'appliquelambda x:[::-1]
à chacun de ses éléments (tuple) à l'inverse, de sorte que chaque tuple devient(value, key)
dans la nouvelle liste craché de la carte. Enfin,dict()
fait une dict à partir de la nouvelle liste.lambda x:[::-1]
à chacun de ses éléments (tuple) à l'inverse, de sorte que chaque tuple devient (valeur, clé) dans la nouvelle liste craché de la carte. Enfin, dict() rend une dict à partir de la nouvelle liste.Peut être fait facilement avec le dictionnaire de la compréhension: l'
À l'aide de boucle:-
Si vous utilisez Python3, c'est un peu différent:
L'ajout d'une solution:
En Python3, il est essentiel que vous utilisez
list(d.keys())
parce quedict.keys
renvoie une vue des clés. Si vous utilisez Python2,d.keys()
est assez.