146 votes

Comment échanger des clés avec des valeurs dans un dictionnaire ?

Je reçois un dictionnaire en entrée, et j'aimerais retourner 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

Je voudrais que mon résultat 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'

Existe-t-il une méthode Python pour y parvenir ?

198voto

liori Points 13629

Python 2 :

res = dict((v,k) for k,v in a.iteritems())

Python 3 (merci à @erik) :

res = dict((v,k) for k,v in a.items())

32voto

Akavall Points 7357

Vous pouvez utiliser compréhensions de dict :

Python 3

res = {v: k for k, v in a.items()}

Python 2

res = {v: k for k, v in a.iteritems()}

Modifié : Pour Python 3, utilisez a.items() au lieu de a.iteritems() . On peut trouver des discussions sur les différences entre eux dans iteritems en Python sur SO.

22voto

Hanan Shteingart Points 116

La réponse principale actuelle suppose que les valeurs sont uniques, ce qui n'est pas toujours le cas. Que faire si les valeurs ne sont pas uniques ? Vous perdrez des informations ! Par exemple :

d = {'a':3, 'b': 2, 'c': 2} 
{v:k for k,v in d.iteritems()} 

renvoie à {2: 'b', 3: 'a'} .

Les informations sur 'c' a été complètement ignorée. Idéalement, cela aurait dû être quelque chose comme {2: ['b','c'], 3: ['a']} . C'est ce que fait la mise en œuvre du bas.

Python 2.x

def reverse_non_unique_mapping(d):
    dinv = {}
    for k, v in d.iteritems():
        if v in dinv:
            dinv[v].append(k)
        else:
            dinv[v] = [k]
    return dinv

Python 3.x

def reverse_non_unique_mapping(d):
    dinv = {}
    for k, v in d.items():
        if v in dinv:
            dinv[v].append(k)
        else:
            dinv[v] = [k]
    return dinv

19voto

Alasdair Points 36535

Vous pouvez essayer :

Python 3

d={'one':1,'two':2}
d2=dict((value,key) for key,value in d.items())
d2
  {'two': 2, 'one': 1}

Python 2

d={'one':1,'two':2}
d2=dict((value,key) for key,value in d.iteritems())
d2
  {'two': 2, 'one': 1}

Attention, vous ne pouvez pas "inverser" un dictionnaire si

  1. Plusieurs clés partagent la même valeur. Par exemple {'one':1,'two':1} . Le nouveau dictionnaire ne peut avoir qu'un seul élément avec la clé 1 .
  2. Une ou plusieurs des valeurs ne sont pas hachables. Par exemple {'one':[1]} . [1] est une valeur valide mais pas une clé valide.

Voir este hilo sur la liste de diffusion python pour une discussion sur le sujet.

18voto

pkit Points 2249

res = dict(zip(a.values(), a.keys()))

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X