Изменить название ключа в словаре


Ответы:


715

Легко сделать в 2 шага:

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

Или в 1 шаг:

dictionary[new_key] = dictionary.pop(old_key)

который будет повышаться, KeyErrorесли dictionary[old_key]не определено. Обратите внимание , что это будет удалить 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
Это вызовет KeyError в любом случае, если ключ не существует, но вы можете использовать его, dict[new_value] = dict.pop(old_value, some_default_value)чтобы избежать этого
Тобиас Кинцлер,

2
Обратите внимание, что это также повлияет на положение ключа в CPython 3.6+ / Pypy и Python 3.7+. То есть в целом позиция old_keyбудет отличаться от позиции new_key.
norok2

63

если вы хотите изменить все ключи:

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}

если вы хотите изменить один ключ: вы можете пойти с любым из приведенных выше предложений.


3
Это создает новый словарь, а не обновляет существующий - что может быть не важно, но не то, о чем спрашивали.
Мартино

15
Тот же ответ с пониманием словаря:{ d1[key] : value for key, value in d.items() }
Morwenn


26

В Python 2.7 и выше вы можете использовать словарное понимание: это пример, с которым я столкнулся при чтении CSV с использованием DictReader. Пользователь добавил суффикс всех имен столбцов к «:»

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

чтобы избавиться от конечного ':' в ключах:

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


«AttributeError: объект dict не имеет атрибута replace»
user1318135

2
user1318125, я бы предложил попробовать копировать вставить. Это работает для меня в консоли Python (.replace выполняется на строке, которая используется в качестве ключа)
north.mister

7

Так как ключи - это словари, используемые для поиска значений, вы не можете их изменить. Самое близкое, что вы можете сделать, это сохранить значение, связанное со старым ключом, удалить его, а затем добавить новую запись с ключом замены и сохраненным значением. Несколько других ответов иллюстрируют различные способы, которыми это может быть достигнуто.


5

Если у вас сложный диктат, это значит, что внутри диктанта есть список или список:

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

Нет прямого способа сделать это, но вы можете удалить, а затем назначить

d = {1:2,3:4}

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

или выполните массовые изменения ключа:

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

2
d = { changeKey(k): v for k, v in d.items()}
Эрих

4

Чтобы преобразовать все ключи в словаре

Предположим, это ваш словарь:

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

Чтобы преобразовать все тире в подчеркивания в образце словарного ключа:

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

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

предположим, что мы хотим заменить ключи элементов списка p = ['a', 'b']. следующий код будет делать:

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

и мы получаем

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

0

Вы можете связать одно и то же значение со многими ключами или просто удалить ключ и повторно добавить новый ключ с тем же значением.

Например, если у вас есть ключи-> значения:

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

нет причин, по которым вы не можете добавлять purple->2или удалять red->1и добавлятьorange->1


0

В случае изменения всех ключей сразу. Здесь я держу ключи.

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

Я не видел этот точный ответ:

dict['key'] = value

Вы даже можете сделать это с атрибутами объекта. Сделайте их в словарь, выполнив это:

dict = vars(obj)

Затем вы можете манипулировать атрибутами объекта так же, как словарь:

dict['attribute'] = value

1
Я не вижу, как это связано с вопросом; не могли бы вы уточнить?
apraetor
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.