Cambiar el nombre de una clave en el diccionario


Respuestas:


715

Fácilmente hecho en 2 pasos:

dictionary[new_key] = dictionary[old_key]
del dictionary[old_key]

O en 1 paso:

dictionary[new_key] = dictionary.pop(old_key)

que aumentará KeyErrorsi dictionary[old_key]no está definido. Tenga en cuenta que esto se eliminará dictionary[old_key].

>>> dictionary = { 1: 'one', 2:'two', 3:'three' }
>>> dictionary['ONE'] = dictionary.pop(1)
>>> dictionary
{2: 'two', 3: 'three', 'ONE': 'one'}
>>> dictionary['ONE'] = dictionary.pop(1)
Traceback (most recent call last):
  File "<input>", line 1, in <module>
KeyError: 1

59
Esto generará un KeyError de cualquier manera si la clave no existe, pero podría usarla dict[new_value] = dict.pop(old_value, some_default_value)para evitar eso
Tobias Kienzler

2
Tenga en cuenta que esto también afectaría la posición de la clave en CPython 3.6+ / Pypy y Python 3.7+. Es decir, en general, la posición de old_keyserá diferente de la posición de new_key.
norok2

63

si quieres cambiar todas las claves:

d = {'x':1, 'y':2, 'z':3}
d1 = {'x':'a', 'y':'b', 'z':'c'}

In [10]: dict((d1[key], value) for (key, value) in d.items())
Out[10]: {'a': 1, 'b': 2, 'c': 3}

si desea cambiar una sola clave: puede ir con cualquiera de las sugerencias anteriores.


3
Esto crea un nuevo diccionario en lugar de actualizar uno existente, lo que puede no ser importante, pero no es lo que se le pidió.
Martineau

15
Misma respuesta con una comprensión del diccionario:{ d1[key] : value for key, value in d.items() }
Morwenn

35

pop'n'fresh

>>>a = {1:2, 3:4}
>>>a[5] = a.pop(1)
>>>a
{3: 4, 5: 2}
>>> 

26

En Python 2.7 y superior, puede usar la comprensión del diccionario: este es un ejemplo que encontré al leer un CSV usando un DictReader. El usuario había sufijado todos los nombres de columna con ':'

ori_dict = {'key1:' : 1, 'key2:' : 2, 'key3:' : 3}

para deshacerse del ':' final en las teclas:

corrected_dict = { k.replace(':', ''): v for k, v in ori_dict.items() }


"AttributeError: el objeto 'dict' no tiene el atributo 'replace'"
user1318135

2
user1318125, sugeriría intentar copiar y pegar. Esto funciona para mí en la consola de Python (el .replace se está ejecutando en la cadena que se usa como clave)
north.mister

7

Como las claves son las que usan los diccionarios para buscar valores, realmente no puede cambiarlas. Lo más cercano que puede hacer es guardar el valor asociado con la clave anterior, eliminarlo y luego agregar una nueva entrada con la clave de reemplazo y el valor guardado. Varias de las otras respuestas ilustran diferentes maneras en que esto se puede lograr.


5

Si tiene un dict complejo, significa que hay un dict o una lista dentro del dict:

myDict = {1:"one",2:{3:"three",4:"four"}}
myDict[2][5] = myDict[2].pop(4)
print myDict

Output
{1: 'one', 2: {3: 'three', 5: 'four'}}

4

No hay forma directa de hacer esto, pero puede eliminar-luego-asignar

d = {1:2,3:4}

d[newKey] = d[1]
del d[1]

o hacer cambios clave en masa:

d = dict((changeKey(k), v) for k, v in d.items())

2
d = { changeKey(k): v for k, v in d.items()}
Erich

4

Para convertir todas las claves en el diccionario

Supongamos que este es su diccionario:

>>> sample = {'person-id': '3', 'person-name': 'Bob'}

Para convertir todos los guiones a guiones bajos en la clave de diccionario de muestra:

>>> sample = {key.replace('-', '_'): sample.pop(key) for key in sample.keys()}
>>> sample
>>> {'person_id': '3', 'person_name': 'Bob'}

3
d = {1:2,3:4}

supongamos que queremos cambiar las claves de los elementos de la lista p = ['a', 'b']. hará el siguiente código:

d=dict(zip(p,list(d.values()))) 

y obtenemos

{'a': 2, 'b': 4}

0

Puede asociar el mismo valor con muchas claves, o simplemente eliminar una clave y volver a agregar una clave nueva con el mismo valor.

Por ejemplo, si tiene claves-> valores:

red->1
blue->2
green->4

no hay razón para que no pueda agregar purple->2o quitar red->1y agregarorange->1


0

En caso de cambiar todas las claves a la vez. Aquí estoy derivando las llaves.

a = {'making' : 1, 'jumping' : 2, 'climbing' : 1, 'running' : 2}
b = {ps.stem(w) : a[w] for w in a.keys()}
print(b)
>>> {'climb': 1, 'jump': 2, 'make': 1, 'run': 2} #output

-3

No he visto esta respuesta exacta:

dict['key'] = value

Incluso puede hacer esto para atributos de objeto. Conviértalos en un diccionario haciendo esto:

dict = vars(obj)

Luego puede manipular los atributos del objeto como lo haría con un diccionario:

dict['attribute'] = value

1
No veo cómo se relaciona esto con la pregunta; ¿podrías por favor elaborar?
Apraetor
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.