使用未知键和未知数量的嵌套字典在字典中进行迭代

是否有更好的方法来解析API响应,而我不知道可以进入多少嵌套字典?

API响应的更改现在会引发嵌套字典。获取响应的所有代码都是基于字典的。

我发现了一种可怕的方法,但是有时我会得到5级嵌套字典.....

示例响应示例:

                    "MalwareProtectionStatus": "disabled","malware": {
                        "Quarantinestatus": "Disabled","config": {
                            "av": {
                                "status": "Disabled","quarantine": {
                                    "status": "Disabled"
                                }
                            },"mg": {
                                "status": "Disabled","quarantine": {
                                    "status": "Disabled"
                                }
                            }
                        }
                    }

我准备了带有输入数据的代码,就像真正的一种结构一样。但这是一种可怕的方法,并且如果API响应获得更多级别的嵌套字典。...那么...需要更多可怕的代码,请看一下...。

我的糟糕代码(为了更好地理解而进行了编辑):

def flatted(_key,_value):
    flatted_rslt = {}
    for k,v in _value.items():
        flatted_rslt.update({f'{_key}_{k}': v})
    return flatted_rslt


def parse_to_flat(_api_response):
    result = {}
    for key,value in _api_response.items():
        if isinstance(value,dict):
            result.update(flatted(key,value))
        else:
            result.update({key: value})
    return result


if __name__ == '__main__':

    api_response = {'level-a1': '1','level-a2': {'level-b1': '21','level-b2': {'level-c1': '31','level-c2': {'level-d1': '41'}}}}

    # flattening level 1
    parsed_api_response_level_1 = parse_to_flat(api_response)
    print(parsed_api_response_level_1)

    # flattening level 2
    parsed_api_response_level_2 = parse_to_flat(parsed_api_response_level_1)
    print(parsed_api_response_level_2)

    # flattening level 3
    parsed_api_response_level_3 = parse_to_flat(parsed_api_response_level_2)
    print(parsed_api_response_level_3)

代码抛出:

{'level-a1': '1','level-a2_level-b1': '21','level-a2_level-b2': {'level-c1': '31','level-c2': {'level-d1': '41'}}}
{'level-a1': '1','level-a2_level-b2_level-c1': '31','level-a2_level-b2_level-c2': {'level-d1': '41'}}
{'level-a1': '1','level-a2_level-b2_level-c2_level-d1': '41'}

它可以工作...但是只有当我知道嵌套字典的级别时,有时我才看到5个级别...

有什么更好的方法吗????

yxc130170 回答:使用未知键和未知数量的嵌套字典在字典中进行迭代

在这里找到了更好的视图:Flatten nested dictionaries,compressing keys

def flatten_dict(dd,separator='_',prefix=''):
    return {prefix + separator + k if prefix else k: v
             for kk,vv in dd.items()
             for k,v in flatten_dict(vv,separator,kk).items()
             } if isinstance(dd,dict) else { prefix : dd }

api_response = {'level-1': '1','level-2': {'leve2-1': '21','leve2-2': {'leve3-1': '31','leve3-2': {'leve4-1': '41','level4-2': {'level5-1': '51'},'level5-2': '52'}}}}


print(flatten(api_response))

输出:

{'level-1': '1','level-2_leve2-1': '21','level-2_leve2-2_leve3-1': '31','level-2_leve2-2_leve3-2_leve4-1': '41','level-2_leve2-2_leve3-2_level4-2_level5-1': '51','level-2_leve2-2_leve3-2_level5-2': '52'}
本文链接:https://www.f2er.com/3143235.html

大家都在问