Recibo un diccionario como entrada y me gustaría devolver un diccionario cuyas claves serán los valores de la entrada y cuyo valor serán las claves de entrada correspondientes. Los valores son únicos.
Por ejemplo, digamos que mi entrada es:
a = dict()
a['one']=1
a['two']=2
Me gustaría que mi salida fuera:
{1: 'one', 2: 'two'}
Para aclarar, me gustaría que mi resultado fuera el equivalente a lo siguiente:
res = dict()
res[1] = 'one'
res[2] = 'two'
¿Alguna forma pitónica ordenada de lograr esto?
python
dictionary
Roee Adler
fuente
fuente
Respuestas:
Python 2:
Python 3 (gracias a @erik):
fuente
[
y]
. ¿la comprensión de una lista no requiere el[
y]
?fuente
Desde Python 2.7 en adelante, incluida la 3.0+, hay una versión posiblemente más corta y legible:
fuente
fuente
Puede hacer uso de dict comprensiones :
Editado: para Python 3, use en
a.items()
lugar dea.iteritems()
. Las discusiones sobre las diferencias entre ellos se pueden encontrar en iteritems en Python en SO.fuente
Tu podrías intentar:
Tenga en cuenta que no puede 'revertir' un diccionario si
{'one':1,'two':1}
. El nuevo diccionario solo puede tener un elemento con clave1
.{'one':[1]}
.[1]
es un valor válido pero no una clave válida.Vea este hilo en la lista de correo de Python para una discusión sobre el tema.
fuente
res = dict(zip(a.values(), a.keys()))
fuente
La respuesta principal actual asume que los valores son únicos, lo que no siempre es el caso. ¿Y si los valores no son únicos? ¡Perderás información! Por ejemplo:
devuelve
{2: 'b', 3: 'a'}
.La información sobre
'c'
fue completamente ignorada. Idealmente debería haber sido algo así{2: ['b','c'], 3: ['a']}
. Esto es lo que hace la implementación inferior.Python 2.x
Python 3.x
fuente
o incluso mejor, pero solo funciona en Python 3:
fuente
Otra forma de ampliar la respuesta de Ilya Prokin es utilizar la
reversed
función.En esencia, su diccionario se itera (usando
.items()
) donde cada elemento es un par clave / valor, y esos elementos se intercambian con lareversed
función. Cuando esto se pasa aldict
constructor, los convierte en pares de valor / clave, que es lo que desea.fuente
Sugerencia de mejora para la respuesta de Javier:
En lugar de
d.keys()
puede escribir simplemented
, porque si revisa el diccionario con un iterador, devolverá las claves del diccionario correspondiente.Ex. para este comportamiento:
fuente
Se puede hacer fácilmente con la comprensión del diccionario:
fuente
.items()
devuelve una lista de tuplas de(key, value)
.map()
pasa por los elementos de la lista y aplicalambda x:[::-1]
a cada uno su elemento (tupla) para revertirlo, por lo que cada tupla se convierte(value, key)
en la nueva lista escupida fuera del mapa. Finalmente,dict()
hace un dictamen de la nueva lista.fuente
lambda x:[::-1]
a cada uno su elemento (tupla) para revertirlo, por lo que cada tupla se convierte en (valor, clave) en la nueva lista que se extrae del mapa. Finalmente, dict () hace un dict de la nueva lista.Usando bucle : -
fuente
Si está usando Python3, es ligeramente diferente:
fuente
Agregar una solución in situ:
En Python3, es fundamental que utilice
list(d.keys())
porquedict.keys
devuelve una vista de las claves. Si está utilizando Python2,d.keys()
es suficiente.fuente
La respuesta de Hanan es la correcta ya que cubre un caso más general (las otras respuestas son un poco engañosas para alguien que desconoce la situación duplicada). Una mejora de la respuesta de Hanan es usar setdefault:
fuente