【问题标题】:Modify dictionary key修改字典键
【发布时间】:2018-08-10 07:29:15
【问题描述】:

您好,我有一本像下面这样的字典

{
'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 .... 可能吗?谢谢你的帮助

【问题讨论】:

    标签: python python-3.x


    【解决方案1】:

    您可以通过更改键和删除初始值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'}]}
    

    【讨论】:

    • 是否可以不创建新列表?因为这是一个巨大的 JSON 文件的一部分,我只想更改这部分
    • 是的,您可以,请参阅编辑,但最好不要像这样更改它
    【解决方案2】:

    这是我的单行样式解决方案,即使您有许多除 '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'
    # }
    

    但是,正如 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'
    # }
    

    【讨论】:

    • 我们能写出可读的代码吗?谁会想要在他们的代码库中出现这样的怪物?
    • @Aran-Fey 我同意你的看法。我已经编辑了我的答案以提出另一种编码方式。
    • 这样更好。但请注意不要在迭代它们时修改 dicts。我已经改变了循环来为你遍历字典的键列表。
    【解决方案3】:

    使用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'}]}
    

    【讨论】:

      【解决方案4】:

      您必须创建新密钥,其值对应于旧密钥。您可以使用dict.pop

      在一行中轻松实现此目的

      我假设您想将行的索引添加到字段 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'}]}
      

      【讨论】:

        【解决方案5】:

        您可以使用 dict 和列表推导:

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

        【讨论】:

          【解决方案6】:

          使用字典理解:

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

          【讨论】:

            【解决方案7】:
            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 中的每个值,然后删除旧的键值对并添加它并更改键名。

            【讨论】:

            • 在 python 3 中,你应该使用list(dct.items()) 而不是dct.items() 以避免在迭代时修改字典。
            猜你喜欢
            • 1970-01-01
            • 2021-07-01
            • 1970-01-01
            • 1970-01-01
            • 2022-01-14
            • 2010-12-28
            • 2020-03-14
            • 2012-03-11
            相关资源
            最近更新 更多