修改字典键

2024-09-27 19:26:57 发布

您现在位置:Python中文网/ 问答频道 /正文

嗨,我有一本下面这样的字典

{
'namelist': [{'name':"John",'age':23,'country':'USA'},
                   {'name':"Mary",'age':12,'country':'Italy'},
                   {'name':"Susan",'age':32,'country':'UK'}],
'classteacher':'Jon Smith'
}

我想知道有没有可能把它改成

 {
 'namelist': [{'name_1':"John",'age_1':23,'country_1':'USA'},
               {'name_2':"Mary",'age_2':12,'country_3':'Italy'},
               {'name_3':"Susan",'age_3':32,'country_3':'UK'}],
 'classteacher':'Jon Smith'
 }

加上1,2。。。。在每把钥匙的最后一个位置 有可能吗?谢谢你的帮助


Tags: nameage字典johncountry钥匙smithmary
3条回答

您可以在初始列表中添加新值,只需更改键并删除初始值yourdict[j+'_'+str(num)] = yourdict.pop(j)

keys()返回dict的所有键(在本例中是name, age, country

a = {'namelist': [{'name':"John",'age':23,'country':'USA'},
                  {'name':"Mary",'age':12,'country':'Italy'},
                  {'name':"Susan",'age':32,'country':'UK'}]}

num = 1
for i in a['namelist']:
    for j in list(i.keys()):
        i[j+'_'+str(num)] = i.pop(j)
    num += 1

print(a)
# {'namelist': [
#    {'name_1': 'John', 'country_1': 'USA', 'age_1': 23}, 
#    {'name_2': 'Mary', 'country_2': 'Italy', 'age_2': 12}, 
#    {'name_3': 'Susan', 'age_3': 32, 'country_3': 'UK'}]}

使用enumerate

例如:

d = {'namelist': [{'name':"John",'age':23,'country':'USA'},
               {'name':"Mary",'age':12,'country':'Italy'},
               {'name':"Susan",'age':32,'country':'UK'}]}

d["namelist"] = [{k+"_"+str(i): v for k,v in value.items()} for i , value in enumerate(d["namelist"], 1)]
print(d)  

输出:

{'namelist': [{'age_1': 23, 'country_1': 'USA', 'name_1': 'John'},
              {'age_2': 12, 'country_2': 'Italy', 'name_2': 'Mary'},
              {'age_3': 32, 'country_3': 'UK', 'name_3': 'Susan'}]}

这是我的单行式解决方案,即使您有许多键而不是“namelist”,它仍然有效:

d = {'namelist': [{'name':"John",'age':23,'country':'USA'},
                   {'name':"Mary",'age':12,'country':'Italy'},
                   {'name':"Susan",'age':32,'country':'UK'}],
     'classteacher':'Jon Smith'
    }


d = {k:[{f'{k2}_{nb}':v2 for k2,v2 in i.items()} for nb,i in enumerate(v,1)] if isinstance(v,list) else v for k,v in d.items()}

print(d)
# {'namelist': [{'name_1': 'John', 'age_1': 23, 'country_1': 'USA'},
#               {'name_2': 'Mary', 'age_2': 12, 'country_2': 'Italy'},
#               {'name_3': 'Susan', 'age_3': 32, 'country_3': 'UK'}]}, 
#  'classteacher': 'Jon Smith'
# }

然而,正如阿兰菲所说,这是不是真的可读性和很难保持。因此,我还建议您使用嵌套for循环的解决方案:

d1 = {'namelist': [{'name':"John",'age':23,'country':'USA'},
                   {'name':"Mary",'age':12,'country':'Italy'},
                   {'name':"Susan",'age':32,'country':'UK'}],
      'classteacher':'Jon Smith'}

for k1,v1 in d1.items():
    if isinstance(v1,list):
        for nb,d2 in enumerate(v1,1):
            for k2 in list(d2):
                d2[f'{k2}_{nb}'] = d2.pop(k2)

print(d1)
# {'namelist': [{'name_1': 'John', 'age_1': 23, 'country_1': 'USA'},
#               {'name_2': 'Mary', 'age_2': 12, 'country_2': 'Italy'},
#               {'name_3': 'Susan', 'age_3': 32, 'country_3': 'UK'}]}, 
#  'classteacher': 'Jon Smith'
# }

相关问题 更多 >

    热门问题