使用递归更新嵌套字典的值

3
我希望通过递归或循环更新inp字典的值来更新Dict字典,同时保持格式不变。请提供适用于所有嵌套级别而非特定情况的解决方案。
dict={
           "name": "john",
           "quality":
                       {
                         "type1":"honest",
                         "type2":"clever"
                      },
         "marks":
                 [
                     {
                          "english":34
                     },
                     {
                          "math":90
                     }
                ]
          }

inp = {
          "name" : "jack",
          "type1" : "dumb",
          "type2" : "liar",
          "english" : 28,
          "math" : 89
      }
2个回答

4

另一种解决方案是就地(in-place)更改字典:

dct = {
    "name": "john",
    "quality": {"type1": "honest", "type2": "clever"},
    "marks": [{"english": 34}, {"math": 90}],
}

inp = {
    "name": "jack",
    "type1": "dumb",
    "type2": "liar",
    "english": 28,
    "math": 89,
}


def change(d, inp):
    if isinstance(d, list):
        for i in d:
            change(i, inp)
    elif isinstance(d, dict):
        for k, v in d.items():
            if not isinstance(v, (list, dict)):
                d[k] = inp.get(k, v)
            else:
                change(v, inp)


change(dct, inp)
print(dct)

输出:

{
    "name": "jack",
    "quality": {"type1": "dumb", "type2": "liar"},
    "marks": [{"english": 28}, {"math": 89}],
}

3

首先,确保你更改第一个字典的名称,比如说改成myDict,因为在Python中dict是保留的类类型。

下面的函数将以递归方式完成你要查找的内容。

def recursive_swipe(input_var, updates):
    if isinstance(input_var, list):
        output_var = []
        for entry in input_var:
            output_var.append(recursive_swipe(entry, updates))
    elif isinstance(input_var, dict):
        output_var = {}
        for label in input_var:
            if isinstance(input_var[label], list) or isinstance(input_var[label], dict):
                output_var[label] = recursive_swipe(input_var[label], updates)
            else:
                if label in updates:
                    output_var[label] = updates[label]
    else:
        output_var = input_var
    return output_var


myDict = recursive_swipe(myDict, inp)

如果您的问题中没有说明两个字典的格式有限制,那么您可以寻找更优化的解决方案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接