簡體   English   中英

修改字典鍵

[英]Modify dictionary key

嗨,我有以下字典

{
'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 ....是否可以? 謝謝您的幫助

您可以通過更改鍵並刪除初始值來在初始列表中添加新值yourdict[j+'_'+str(num)] = yourdict.pop(j)

keys()返回字典的所有鍵( 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'}]}

您將必須創建新密鑰,其值對應於舊密鑰。 您可以使用dict.pop在一行中輕松完成此dict.pop

我假設您想將行的索引添加到field name 對於其他字段或以其他方式修改它們,您可以執行類似的操作。

for index, row in enumerate(a['namelist']):
    row['name_%d' % index] = row.pop('name')

輸出:

{'namelist': [{'age': 23, 'country': 'USA', 'name_0': 'John'},
  {'age': 12, 'country': 'Italy', 'name_1': 'Mary'},
  {'age': 32, 'country': 'UK', 'name_2': 'Susan'}]}

這是我的單行樣式解決方案,即使您除了“名稱列表”以外還有許多鍵,該方法也可以使用:

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'
# }

但是,正如阿蘭·費伊(Aran-Fey)所說,這並不是很容易閱讀,而且很難維護。 因此,我還建議您使用嵌套的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'
# }

您可以使用字典和列表推導:

d = {'namelist': [{'name': "John", 'age': 23, 'country': 'USA'},
              {'name': "Mary", 'age': 12, 'country': 'Italy'},
              {'name': "Susan", 'age': 32, 'country': 'UK'}]}
d = {k: [{'_'.join((n, str(i))): v for n, v in s.items()} for i, s in enumerate(l, 1)] for k, l in d.items()}

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'}]}
for i, dct in enumerate(inp['namelist'], 1):
    for key, value in list(dct.items()):  # take a copy since we are modifying the dct
        del dct[key]  # delete old pair
        dct[key+'_'+str(i)] = value  # new key format

這樣就可以了。 您沒有使用額外的內存。 遍歷dict每個值,然后刪除舊的鍵-值對,並在鍵名更改的情況下添加它。

使用字典理解:

    mydictionary['namelist'] = [dict((key + '_' + str(i), value) for key,value in mydictionary['namelist'][i-1].items()) for i in [1, 2, 3]]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM