在与列表混合的嵌套字典中查找键

我从 API 获取 JSON 数据。数据集很大并且是嵌套的。我可以Datenreihen这样访问密钥:


jsondata.get("Ergebnis")[0].get("Kontakte").get("Datenreihen")

正如您所看到的,这是字典和列表的混合体。


我尝试了以下方法,但对于列表不起作用:-(。


def recursive_lookup(k, d):

    if k in d:

        return d[k]

    for v in d.values():

        if isinstance(v, dict):

            return recursive_lookup(k, v)

    return None


# Works

recursive_lookup("Ergebnis", jsondata)


# Returns None

recursive_lookup("Datenreihen", jsondata)

无论我的对象嵌套多深,是否有一种简单的方法可以访问和键入我的字典?


这是示例数据:

{

    "Success":true,

    "Ergebnis":[

       {

          "ErgA1a: KPI Zeitreihe":{

             "Message":"",

             "MitZielgruppe":true,

             "Beschriftung":[

                "2019 KW 27",

                "2019 KW 28",

                "2019 KW 29"

             ],

             "Datenreihen":{

                "Gesamt":{

                   "Name":"Sympathie [#4]\n(Sehr sympathisch, Sympathisch)",

                   "Werte":[

                      39.922142815641145,

                      37.751410794385762,

                      38.35504885993484

                   ]

                }

             }

          }

       }

    ],

    "rest":[

       {

          "test":"bla"

       }

    ]

 }


 data.get("ErgebnisseAnalyse")[0].get("ErgA1a: KPI Zeitreihe")


recursive_lookup("ErgA1a: KPI Zeitreihe", data)


红颜莎娜
浏览 49回答 1
1回答

茅侃侃

递归函数根据键字段在嵌套字典中查找值代码def find_item(obj, field):    """    Takes a dict with nested lists and dicts,    and searches all dicts for a key of the field    provided.    """    if isinstance(obj, dict):        for k, v in obj.items():            if k == field:                yield v            elif isinstance(v, dict) or isinstance(v, list):                yield from find_item(v, field)    elif isinstance(obj, list):        for v in obj:            yield from find_item(v, field)用法value = next(find_item(dictionary_object, field), None)测试# Nested dictionarydic = {    "a": [{"b": {"c": 1}},          {"d": 2}],     "e": 3}# Values form various fieldsprint(next(find_item(dic, "a"), None))  # Output: [{'b': {'c': 1}}, {'d': 2}]print(next(find_item(dic, "b"), None))  # Output: {'c': 1}print(next(find_item(dic, "c"), None))  # Output: 1print(next(find_item(dic, "d"), None))  # Output: 2print(next(find_item(dic, "e"), None))  # Output: 3print(next(find_item(dic, "h"), None))  # Output: None
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python