เปลี่ยนชื่อของคีย์ในพจนานุกรม


คำตอบ:


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)เพื่อหลีกเลี่ยงปัญหานั้นได้
Tobias Kienzler

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
สิ่งนี้สร้างพจนานุกรมใหม่แทนที่จะอัปเดตพจนานุกรมที่มีอยู่ซึ่งอาจไม่สำคัญ แต่ไม่ใช่สิ่งที่ถูกถาม
martineau

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' ไม่มีแอตทริบิวต์ 'แทนที่'"
user1318135

2
user1318125 ฉันขอแนะนำให้ลองคัดลอกวาง สิ่งนี้ใช้ได้กับฉันในคอนโซล python (.replace กำลังถูกเรียกใช้งานบนสตริงที่ใช้เป็นกุญแจ)
north.mister

7

เนื่องจากคีย์เป็นพจนานุกรมที่ใช้ในการค้นหาค่าคุณจึงไม่สามารถเปลี่ยนแปลงได้ สิ่งที่ใกล้เคียงที่สุดที่คุณสามารถทำได้คือการบันทึกค่าที่เกี่ยวข้องกับคีย์เก่าลบมันแล้วเพิ่มรายการใหม่ด้วยคีย์การแทนที่และค่าที่บันทึกไว้ คำตอบอื่น ๆ อีกมากมายแสดงให้เห็นถึงวิธีการที่แตกต่างกันซึ่งสามารถทำได้


5

หากคุณมี dict ที่ซับซ้อนแสดงว่ามี dict หรือรายการอยู่ภายใน 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

ไม่มีวิธีโดยตรงในการทำเช่นนี้ แต่คุณสามารถลบแล้วกำหนด

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

คุณสามารถเชื่อมโยงค่าเดียวกันกับหลาย ๆ คีย์หรือเพียงแค่ลบคีย์และเพิ่มคีย์ใหม่อีกครั้งด้วยค่าเดียวกัน

ตัวอย่างเช่นหากคุณมีค่า keys->:

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.