Ubah nama kunci dalam kamus

Jawaban:

715

Mudah dilakukan dalam 2 langkah:

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

Atau dalam 1 langkah:

dictionary[new_key] = dictionary.pop(old_key)

yang akan naik KeyErrorjika dictionary[old_key]tidak ditentukan. Perhatikan bahwa ini akan dihapus 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
sumber
59
Ini akan memunculkan KeyError jika kuncinya tidak ada, tetapi Anda dapat menggunakannya dict[new_value] = dict.pop(old_value, some_default_value)untuk menghindari itu
Tobias Kienzler
2
Perhatikan bahwa ini juga akan memengaruhi posisi kunci pada CPython 3.6+ / Pypy dan Python 3.7+. Artinya secara umum posisi old_keyakan berbeda dengan posisi new_key.
norok2
63

jika Anda ingin mengubah semua kunci:

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}

jika Anda ingin mengubah satu kunci: Anda dapat menggunakan salah satu dari saran di atas.

Tauquir
sumber
3
Ini membuat kamus baru alih-alih memperbarui yang sudah ada - yang mungkin tidak penting, tetapi bukan yang diminta.
martineau
15
Jawaban yang sama dengan pemahaman kamus:{ 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
sumber
26

Dalam python 2.7 dan lebih tinggi, Anda dapat menggunakan pemahaman kamus: Ini adalah contoh yang saya temui saat membaca CSV menggunakan DictReader. Pengguna telah mengakhiri semua nama kolom dengan ':'

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

untuk menghilangkan jejak ':' di tombol:

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

Menangkal
sumber
"AttributeError: objek 'dict' tidak memiliki atribut 'ganti'"
user1318135
2
user1318125, saya sarankan mencoba salin tempel. Ini berfungsi untuk saya di konsol python (.replace dieksekusi pada string yang digunakan sebagai kunci)
north.mister
7

Karena kunci adalah apa yang digunakan kamus untuk mencari nilai, Anda tidak dapat benar-benar mengubahnya. Hal terdekat yang dapat Anda lakukan adalah menyimpan nilai yang terkait dengan kunci lama, menghapusnya, lalu menambahkan entri baru dengan kunci pengganti dan nilai yang disimpan. Beberapa jawaban lain menggambarkan cara berbeda yang dapat dilakukan.

martineau
sumber
5

Jika Anda memiliki dict yang kompleks, itu artinya ada dict atau daftar dict tersebut:

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
sumber
4

Tidak ada cara langsung untuk melakukan ini, tetapi Anda dapat menghapus-kemudian-menetapkan

d = {1:2,3:4}

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

atau lakukan perubahan kunci massal:

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

Untuk mengonversi semua kunci dalam kamus

Misalkan ini kamus Anda:

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

Untuk mengonversi semua tanda hubung menjadi garis bawah pada kunci kamus sampel:

>>> sample = {key.replace('-', '_'): sample.pop(key) for key in sample.keys()}
>>> sample
>>> {'person_id': '3', 'person_name': 'Bob'}
Pranjal Singi
sumber
3
d = {1:2,3:4}

misalkan kita ingin mengubah kunci ke elemen daftar p = ['a', 'b']. kode berikut akan dilakukan:

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

dan kita dapatkan

{'a': 2, 'b': 4}
Ksreenivas Karanam
sumber
0

Anda dapat mengaitkan nilai yang sama dengan banyak tombol, atau cukup menghapus kunci dan menambahkan kembali kunci baru dengan nilai yang sama.

Misalnya, jika Anda memiliki nilai keys->:

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

tidak ada alasan Anda tidak dapat menambah purple->2atau menghapus red->1dan menambahorange->1

Bina Marga
sumber
0

Dalam hal mengubah semua kunci sekaligus. Di sini saya membendung kunci.

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
sumber
-3

Saya belum melihat jawaban persis ini:

dict['key'] = value

Anda bahkan dapat melakukan ini pada atribut objek. Jadikan mereka menjadi kamus dengan melakukan ini:

dict = vars(obj)

Kemudian Anda dapat memanipulasi atribut objek seperti kamus Anda:

dict['attribute'] = value
MicahT
sumber
1
Saya tidak melihat bagaimana ini terkait dengan pertanyaan; bisakah kamu menjelaskan lebih lanjut?
apraetor