2011-11-29 47 views

Respuesta

48
my_dict2 = dict((y,x) for x,y in my_dict.iteritems()) 

Si está utilizando Python 2.7 o 3.x, puede utilizar una comprensión de diccionario en su lugar:

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

Editar

Como se señaló en los comentarios de JBernardo, para 3.x pitón es necesario utilizar items en lugar de iteritems

+2

'.iteritems()' no es válido en Python 3.x ... – JBernardo

+0

@JBernardo: corrigió las gracias Me olvidé de eso – GWW

+0

otra corrección - haciendo la comprensión del diccionario que sugiere '{(y, x) para x, y en dic_cols_w.items()} 'devuelve un conjunto, no un diccionario. Todavía necesitarías envolver esto en un 'dict (...) 'para obtener un diccionario – tsando

4

Prueba esto:

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

new_dict = {} 
for k, v in my_dict.items(): 
    new_dict[v] = k 
6

Usar este código (modificado trivialmente) de la respuesta aceptada en Python reverse/invert a mapping:

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

Tenga en cuenta que esto supone que los valores en el diccionario original son únicos. De lo contrario, terminarías con llaves duplicadas en el diccionario resultante, y eso no está permitido.

Y, como señala @wim, también asume que los valores son hashable. Consulte the Python glossary si no está seguro de qué es y qué no es hashable.

4

quizá:

flipped_dict = dict(zip(my_dict.values(), my_dict.keys()))

+2

esto probablemente no es seguro, ya que depende de la clave y el orden de los valores, aunque resultó que funcionó para mí. Me gusta la (s) respuesta (s) de JBernardo/GWW. – aaron

+0

Probablemente sea mejor usar 'iterkeys' y' itervalues' – GWW

+0

Eso es seguro si el dict no se cambia durante la operación. Me gustó porque lo hiciste sin una comprensión. – JBernardo

1
my_dict = { my_dict[k]:k for k in my_dict} 
2

A veces, la condición de que los valores son todos únicos no llevará a cabo, en cuyo caso, las respuestas anteriores destruirán todos los valores duplicados.

La siguiente rollos de los valores que podrían ser duplicados para arriba en una lista:

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

estoy seguro de que hay un método mejor (no-lista-comp), pero tuve un problema con las respuestas anteriores , así que pensé en proporcionar mi solución en caso de que otros tuvieran un caso de uso similar.

P.S. ¡No espere que el dict permanezca ordenado después de cualquier cambio en el original! Este método es un uso de una sola vez en un dict estático: ¡ha sido advertido!

0

En primer lugar es no garantizado que esto es posible, ya que los valores de un diccionario pueden ser inigualables.

En caso de que estos no son, podemos utilizar un enfoque funcional con:

reversed_dict = dict(map(reversed, original_dict.items())) 
Cuestiones relacionadas