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
moinudin
fuente
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.

Tauquir
fuente
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}
>>> 
kevpie
fuente
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() }

Sala
fuente
"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.

Martineau
fuente
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'}}
Hatem
fuente
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())
AndiDog
fuente
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'}
Pranjal Singi
fuente
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}
Ksreenivas Karanam
fuente
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

DGH
fuente
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
Ananth Kumar Vasamsetti
fuente
-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
MicahT
fuente
1
No veo cómo se relaciona esto con la pregunta; ¿podrías por favor elaborar?
Apraetor