Alterar todas las claves de un diccionario
Avatar N08
Pregunta contestada

Alterar todas las claves de un diccionario

¿Es posible cambiar el nombre/alterar todas las claves de un dictado? Como ejemplo, veamos el siguiente diccionario:

a_dict = {'a_var1': 0.05,
          'a_var2': 4.0,
          'a_var3': 100.0,  
          'a_var4': 0.3}

Quiero eliminar todo el a_ de las claves, así que termino con

a_dict = {'var1': 0.05,
          'var2': 4.0,
          'var3': 100.0,  
          'var4': 0.3}
Mostrar la mejor respuesta

¿Todas las claves tienen el prefijo 'a_', o pueden ser 'b_', foo_', etc.? ¿Qué hacer en esos casos?

¿Desea alterar específicamente las claves en un dictado existente, o estaría bien o preferiría crear un dictado nuevo?

Avatar N08

@WillemVanOnsem Siempre es el mismo prefijo

Avatar N08

@tobias_k Preferiría modificarlos en un dict existente

Puedes usar:

{k[2:]: v for k, v in a_dict.items()}

Técnicamente, esto no altera ninguna clave, sino que crea un nuevo dict.

... ya que no puedes cambiar las claves de un dict

@ Jean-FrançoisFabre Supongo que es porque OP no está familiarizado con la terminología. Su intención es clara...

@tobias_k Estoy de acuerdo, pero esta es una parte poco clara de su pregunta. "Alterar todas las claves" siempre es imposible. Solo sabes por su comentario que quieren mantener el dictado original.

Puedes hacerlo fácilmente con una comprensión de dictados.

a_dict = {'a_var1': 0.05,
          'a_var2': 4.0,
          'a_var3': 100.0,  
          'a_var4': 0.3}

a_dict = { k[2:]:v for k,v in a_dict.items() }

Resultado:

{'var1': 0.05, 'var2': 4.0, 'var3': 100.0, 'var4': 0.3}

Puede usar el str.replace función para reemplazar la clave para que coincida con el formato deseado.

a_dict = {'a_var1': 0.05,
          'a_var2': 4.0,
          'a_var3': 100.0,  
          'a_var4': 0.3}

a_dict = {k.replace('a_', ''): v for k, v in a_dict.items()}
# {'var1': 0.05, 'var2': 4.0, 'var3': 100.0, 'var4': 0.3}

Si desea modificar el dict existente, en lugar de crear uno nuevo, puede repetir las claves, pop la anterior e insertar la nueva clave modificada con el valor anterior.

>>> for k in list(a_dict):
...     a_dict[k[2:]] = a_dict.pop(k)     
...
>>> a_dict
{'var2': 4.0, 'var1': 0.05, 'var3': 100.0, 'var4': 0.3}

(Iterar un list(a_dict) evitará errores debido a modificaciones simultáneas).

Estrictamente hablando, esto tampoco altera las claves existentes, sino que inserta nuevas claves, ya que tiene que volver a insertarlas de acuerdo con sus nuevos códigos hash. Pero altera el diccionario como un todo.


Como se indica en los comentarios, actualizar las claves en el dict en un bucle puede ser más lento que la comprensión de un dict. Si esto es un problema, también podría crear un dictado nuevo usando una comprensión de dictado y luego clear el dictado existente y update con los nuevos valores.

>>> b_dict = {k[2:]: a_dict[k] for k in a_dict}
>>> a_dict.clear()
>>> a_dict.update(b_dict)

Aunque esto responde con precisión a la pregunta de OP, recomendaría usar una comprensión de dict como se presenta en las otras respuestas si el dict es o puede ser grande, por razones de rendimiento.