¿Hay alguna forma de cambiar el nombre de una clave de diccionario, sin reasignar su valor a un nuevo nombre y eliminar la antigua clave de nombre; y sin iterar a través de la clave / valor dict?
En el caso de OrderedDict, haga lo mismo, manteniendo la posición de esa clave.
python
dictionary
associative-array
ordereddictionary
rabin utam
fuente
fuente
OrderedDict
. los dictados ignoran el orden cuando se comparan por igualdad, mientras queOrderedDict
tienen en cuenta el orden cuando se comparan. Sé que se vinculó a algo que lo explica, pero pensé que su comentario podría haber engañado a quienes no lo hayan leído.OrderedDict
toma en cuenta el orden cuando se compara" Ok, pero a nadie le importa después de 3.7. Afirmo queOrderedDict
es en gran parte obsoleto, ¿puede articular razones por las que no lo es? por ejemplo, aquí no es persuasivo a menos que lo necesitereversed()
Respuestas:
Para un dict regular, puede usar:
Para un OrderedDict, creo que debes construir uno completamente nuevo usando una comprensión.
La modificación de la clave en sí, como parece ser esta pregunta, no es práctica porque las claves dict son generalmente objetos inmutables como números, cadenas o tuplas. En lugar de intentar modificar la clave, reasignar el valor a una nueva clave y eliminar la clave anterior es cómo puede lograr el "cambio de nombre" en python.
fuente
dict.pop
es viable para un OrderedDict basado en mi prueba.OrderedDict
conservará el orden de inserción, que no es de lo que se hizo la pregunta.mejor método en 1 línea:
fuente
d = {('test', 'foo'):[0,1,2]}
?d[('new', 'key')] = d.pop(('test', 'foo'))
Usando un cheque para
newkey!=oldkey
, de esta manera puede hacer:fuente
dict
orden, incluso si python3.6 + lo inicializa en forma ordenada, las versiones anteriores no lo hacen y no es realmente una característica, solo un efecto secundario de cómo se modificaron los dictados de py3.6 +. ÚseloOrderedDict
si le importa el orden.En caso de renombrar todas las teclas del diccionario:
fuente
target_dict.keys()
garantiza que tenga el mismo orden que en la definición? Pensé que un dict de Python no está ordenado, y el orden desde la vista de claves de un dict es impredeciblePuede usar esto
OrderedDict recipe
escrito por Raymond Hettinger y modificarlo para agregar unrename
método, pero esto será una O (N) en complejidad:Ejemplo:
salida:
fuente
OrderedDict
. Pero recomendaría: Crear una clase que heredeOrderedDict
y agregarle unrename
método.Algunas personas antes que yo mencionaron el
.pop
truco para eliminar y crear una clave en una sola línea.Personalmente encuentro que la implementación más explícita es más legible:
El código anterior devuelve
{'a': 1, 'c': 2}
fuente
Otras respuestas son bastante buenas, pero en python3.6, el dict regular también tiene orden. Por lo tanto, es difícil mantener la posición de la llave en el caso normal.
fuente
En Python 3.6 (¿en adelante?) Iría por el siguiente one-liner
que produce
Vale la pena señalar que sin la
print
declaración la consola ipython / notebook jupyter presenta el diccionario en el orden que elijan ...fuente
Se me ocurrió esta función que no muta el diccionario original. Esta función también es compatible con la lista de diccionarios.
fuente
Estoy usando la respuesta de @wim anterior, con dict.pop () al cambiar el nombre de las teclas, pero encontré un problema. Al recorrer el dict para cambiar las claves, sin separar la lista de claves antiguas por completo de la instancia del dict, resultó en el ciclo de claves nuevas, cambiadas en el bucle y se perdieron algunas claves existentes.
Para empezar, lo hice de esta manera:
Descubrí que al recorrer el dict de esta manera, el diccionario seguía encontrando claves incluso cuando no debería, es decir, ¡las nuevas claves, las que había cambiado! Necesitaba separar las instancias completamente entre sí para (a) evitar encontrar mis propias claves cambiadas en el ciclo for, y (b) encontrar algunas claves que no se encontraban dentro del ciclo por alguna razón.
Estoy haciendo esto ahora:
Fue necesario convertir my_dict.keys () en una lista para liberarse de la referencia al cambio dict. Solo usando my_dict.keys () me mantuvo atado a la instancia original, con los extraños efectos secundarios.
fuente
En caso de que alguien quiera cambiar el nombre de todas las claves a la vez proporcionando una lista con los nuevos nombres:
fuente
@ helloswift123 Me gusta tu función. Aquí hay una modificación para cambiar el nombre de varias claves en una sola llamada:
fuente
Suponga que desea cambiar el nombre de la clave k3 a k4:
fuente
TypeError: 'dict' object is not callable
Si contemp_dict('k3')
usted está tratando de hacer referencia al valor de lak3
clave, entonces debe usar corchetes y no paréntesis. Sin embargo, esto solo agregará una nueva clave al diccionario y no cambiará el nombre de una clave existente, como se solicitó.