代码之家  ›  专栏  ›  技术社区  ›  t.pellegrom

当您只有最后一层的键、值列表时,如何填充嵌套dict?

  •  0
  • t.pellegrom  · 技术社区  · 2 年前

    我有一个福林形式的嵌套dict:

    dict1 = {layer1: {layer2: {layer3: {a:None, b:None, c:None}}, {d:None, e:None}}}
    

    dict2 = {a:1, b:2, c:3, d:4, e:5}
    

    填写第一个dict中的值后,我的预期输出为:

    dict_out = {layer1: {layer2: {layer3: {a:1, b:2, c:3}}, {d:4, e:5}}}
    

    我应该如何处理这个问题?

    2 回复  |  直到 2 年前
        1
  •  1
  •   Andrej Kesely    2 年前

    我希望我正确理解了你的问题。可以使用递归替换键的值:

    dct = {
        "layer1": {
            "layer2": {"layer3": {"a": 0, "b": 0, "c": 0}},
            "layer4": {"d": 0, "e": 0},
        }
    }
    
    dct2 = {"a": 1, "b": 2, "c": 3, "d": 4, "e": 5}
    
    
    def replace(d):
        if isinstance(d, dict):
            for k in d & dct2.keys():
                d[k] = dct2[k]
    
            for k in d - dct2.keys():
                replace(d[k])
    
        elif isinstance(d, list):
            for i in d:
                replace(i)
    
    
    replace(dct)
    print(dct)
    

    打印:

    {
        "layer1": {
            "layer2": {"layer3": {"a": 1, "b": 2, "c": 3}},
            "layer4": {"d": 4, "e": 5},
        }
    }
    
        2
  •  1
  •   Jab    2 年前

    另一种使用递归的方法,实际上只需要一个写循环。我发现这更容易理解。它也不会改变原来的dict:

    data = {"layer1": {"layer2": {"layer3": {"a": None, "b": None, "c": None}, "layer4": {"d": None, "e": None}}}}
    values = {"a": 1, "b": 2, "c": 3, "d": 4, "e": 5}
    
    def fill_data(data):
        out = {}
    
        for key, value in data.items():
            if isinstance(value, dict):
                out[key] = fill_data(value)
            else:
                out[key] = values.get(key, value)
    
        return out
    
    print(fill_data(data))
    

    {'layer1': {'layer2': {'layer3': {'a': 1, 'b': 2, 'c': 3}, 'layer4': {'d': 4, 'e': 5}}}}