使用Python和JSON递归地获取与值关联的所有键

2024-09-27 21:29:32 发布

您现在位置:Python中文网/ 问答频道 /正文

给出以JSON格式组织的数据(代码示例如下)如何获得与给定值相关联的键和子键的路径?在

输入“23314”时,我们需要返回一个列表: 法内罗佐科、塞诺佐科、第四纪、更新世、苏必利尔。在

由于数据是一个json文件,因此我们使用python和json lib对其进行了解码:

import json

def decode_crono(crono_file):
    with open(crono_file) as json_file:
        data = json.load(json_file)

现在我们不知道如何对待它,以获得我们所需要的。 我们可以访问如下密钥:

k=数据[“Fanerozoico”][“Cenozoico”][“Quaternario”][“更新世”].keys()

或者像这样的值:

v=数据[“Fanerozoico”][“Cenozoico”][“Quaternario”][“更新世”][“Superior”].values()

但这离我们需要的还很远。在

^{pr2}$

Tags: 文件数据代码路径json示例列表格式
2条回答

假设您需要完整的字典路径,直到名为id的键具有特定值,下面是一个递归解决方案,它迭代整个dict。请记住:

  • 代码根本没有优化
  • 对于巨大的json对象,它可能会生成StackOverflow:)
  • 它将在第一次发现值时停止(理论上,如果json语义正确,则不应超过1)

代码:

import json
from types import DictType

SEARCH_KEY_NAME = "id"
FOUND_FLAG = ()
CRONO_FILE = "a.jsn"


def decode_crono(crono_file):
    with open(crono_file) as json_file:
        return json.load(json_file)


def traverse_dict(dict_obj, value):
    for key in dict_obj:
        key_obj = dict_obj[key]
        if key == SEARCH_KEY_NAME and key_obj == value:
            return FOUND_FLAG
        elif isinstance(key_obj, DictType):
            inner = traverse_dict(key_obj, value)
            if inner is not None:
                return (key,) + inner
    return None


if __name__ == "__main__":
    value = "23314"
    json_dict = decode_crono(CRONO_FILE)
    result = traverse_dict(json_dict, value)
    print result

很难确切地理解您在这里想要的是什么,但是由于某种原因,您似乎有一堆嵌套的json,您希望在其中搜索一个id并返回一个表示json嵌套路径的列表。如果是这样的话,快速而简单的方法是在字典(从json.load)上递归并收集键。当您找到与您正在搜索的'id'匹配的'id'键时,就完成了。下面是一些代码:

def all_keys(search_dict, key_id):
    def _all_keys(search_dict, key_id, keys=None):
        if not keys:
            keys = []
        for i in search_dict:
            if search_dict[i] == key_id:
                return keys + [i]
            if isinstance(search_dict[i], dict):
                potential_keys = _all_keys(search_dict[i], key_id, keys + [i])
                if 'id' in potential_keys:
                    keys = potential_keys
                    break
        return keys
    return _all_keys(search_dict, key_id)[:-1]

嵌套函数的原因是去掉'id'键,否则它将位于列表的末尾。在

这实际上只是为了让你知道一个解决方案可能是什么样子。Beware the python recursion limit!在

相关问题 更多 >

    热门问题