【问题标题】:Adding new (key,value) pair in nested dictionary - python3在嵌套字典中添加新的(键,值)对 - python3
【发布时间】:2020-08-17 01:24:42
【问题描述】:

您好,我创建了一个(我称之为)嵌套字典:

gradeDict = { 
   "Intro to Programming":{ 
      "student":{ 
         "firstname":"Mike",
         "lastname":"Miller",
         "marks":{ 
            "PS01":70,
            "PS02":80
         }
      }
   }
}
print(gradeDict['Intro to Programming']['student']['marks'])

在询问键'marks'中的值后给出值

{'PS01': 70, 'PS02': 80}

太完美了。现在我想在上级键'marks'中添加一个新的(键,值)对:

gradeDict.update( {"Intro to Programming":{ "student":{ "firstname":"Mike",
         "lastname":"Miller","marks":{ "PS03":10}}}} )

print(gradeDict['Intro to Programming']['student']['marks'])

不幸的是,这给了

{'PS03': 10}

我不明白,一个键只有在它已经存在时才应该被覆盖,否则附加。 'marks' 存在,但 'PS03' 不存在。我在这里缺少什么,或者如何获得所需的条目:

{'PS01': 70, 'PS02': 80, 'PS03': 10}

非常感谢...

【问题讨论】:

    标签: python-3.x dictionary nested


    【解决方案1】:

    很好的推理,但dict.update 并不完全像那样工作。它不会递归地检查每个元素,而是会看到键 "Intro to Programming" 已经存在于第一层中,因此它会用 {"student":{ "firstname":"Mike", "lastname":"Miller","marks":{ "PS03":10}}} 覆盖其值。

    看这个演示:

    gradeDict = { 
       "Intro to Programming":{ 
          "student":{ 
             "firstname":"Mike",
             "lastname":"Miller",
             "marks":{ 
                "PS01":70,
                "PS02":80
             }
          }
       }
    }
    
    gradeDict.update(
        {"Intro to Programming": {"NEW VALUE": {"firstname": "Mike", "lastname": "Miller","marks": {"PS03": 10}}}}
    )
    
    print(gradeDict)
    

    输出:

    {'Intro to Programming': {'NEW VALUE': {'firstname': 'Mike', 'lastname': 'Miller', 'marks': {'PS03': 10}}}}
    

    如果您想要这种递归更新,请在 Google 上快速搜索 found for example this(适用于 Python 3,未经过广泛测试):

    from collections.abc import Mapping
    
    
    def dict_merge(dct, merge_dct):
        for k, v in merge_dct.items():
            if (k in dct and isinstance(dct[k], dict)
                    and isinstance(merge_dct[k], Mapping)):
                dict_merge(dct[k], merge_dct[k])
            else:
                dct[k] = merge_dct[k]
    
    
    gradeDict = { 
       "Intro to Programming":{ 
          "student":{ 
             "firstname":"Mike",
             "lastname":"Miller",
             "marks":{ 
                "PS01":70,
                "PS02":80
             }
          }
       }
    }
    
    dict_merge(gradeDict, {"Intro to Programming": {"student": {"firstname": "Mike", "lastname": "Miller","marks": {"PS03": 10}}}})
    
    print(gradeDict)
    

    输出:

    {'Intro to Programming': {'student': {'firstname': 'Mike', 'lastname': 'Miller', 'marks': {'PS01': 70, 'PS02': 80, 'PS03': 10}}}}
    

    【讨论】:

    • 非常感谢,这会很好,但比我想象的更非pythonic!我觉得递归更新应该是字典的主要特征(一般来说)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-17
    • 2019-12-17
    • 2019-02-14
    • 2018-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多