Python查找不限层级Json数据中某个key或者value的路径方式

Python可以使用递归函数在不限层级的Json数据中查找某个key或value的路径,具体步骤如下:

  1. 定义递归函数,参数包括待查找的key或value、json数据、路径列表。
  2. 遍历json数据的每个key-value对。
  3. 若当前key或value与待查找的相等,则将当前key的路径加入路径列表中。
  4. 若当前value是一个字典,则递归调用函数,传入当前value作为新的json数据,paths作为新的路径列表。
  5. 若当前value是一个列表,则遍历列表,若元素是字典则递归调用函数,传入元素字典作为新的json数据,paths作为新的路径列表。

以下是两个示例:

对于以下json数据:

{
  "name": "Alice",
  "age": 22,
  "pets": [
    {
      "name": "Charlie",
      "type": "dog",
      "age": 3,
      "friends": [
        {"name": "Lola", "type": "dog"},
        {"name": "Max", "type": "cat"}
      ]
    },
    {
      "name": "Lucy",
      "type": "cat",
      "age": 1,
      "friends": [
        {"name": "Charlie", "type": "dog"},
        {"name": "Bella", "type": "cat"}
      ]
    }
  ]
}

要找到所有宠物friends中type为“cat”的路径,可以使用以下代码实现:

def find_paths_by_value(val, data, paths):
    if isinstance(data, dict):
        for k, v in data.items():
            if v == val:
                paths.append(k)
            elif isinstance(v, dict):
                find_paths_by_value(val, v, [k] + paths)
            elif isinstance(v, list):
                for idx, item in enumerate(v):
                    if isinstance(item, dict):
                        find_paths_by_value(val, item, [k, idx] + paths)

paths = []
find_paths_by_value("cat", data, paths)
print(paths)

运行结果为:

[['pets', 0, 'friends', 1, 'type'], ['pets', 1, 'friends', 1, 'type']]

可以看到,该代码找到了两个路径,分别对应两只猫友。

对于以下json数据:

{
  "path1": {
    "path2": {
      "path3": {
        "path4": {
          "key": "value"
        }
      }
    }
  }
}

要找到key为"value"的路径,可以使用以下代码实现:

def find_paths_by_key(key, data, paths):
    if isinstance(data, dict):
        for k, v in data.items():
            if k == key:
                paths.append([k])
            elif isinstance(v, dict):
                for subpath in find_paths_by_key(key, v, []):
                    paths.append([k] + subpath)

paths = []
find_paths_by_key("key", data, paths)
print(paths)

运行结果为:

[['path1', 'path2', 'path3', 'path4', 'key']]

可以看到,该代码找到了一个路径,对应key为"value"的位置。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python查找不限层级Json数据中某个key或者value的路径方式 - Python技术站

(0)
上一篇 2023年6月3日
下一篇 2023年6月3日

相关文章

  • python中tab键是什么意思

    当我们在Python中输入代码时,我们会注意到在某些情况下,按下Tab键会产生一些特殊的效果。这种情况下,Tab键被用作缩进的符号。 在Python中,缩进是非常重要的,它可以告诉Python哪些代码块是属于同一级别的。Python用缩进来表示代码块的层次结构,而不是花括号或其他符号。因此,缩进的正确使用极其重要。 当您按Tab键时,Python会自动把光标…

    python 2023年5月20日
    00
  • python快速直白入门(半新手向,老手复习向)

    主用python做项目有一段时间,这次简单总结学习下。为后面的项目编写,进行一次基础知识的查缺补漏、 1、变量名和数据类型 “”” 变量名,只能由” 数字、大小写字母、_ ” 组成,且不能以数字开头 “”” # 整数 int # hashable,不可变对象 a = 5 # 浮点数 float # hashable,不可变对象 a1 = 3.14 # 字符串…

    python 2023年5月8日
    00
  • python批量添加zabbix Screens的两个脚本分享

    下面是详细的攻略: 安装前准备 在使用这两个Python脚本前,需要在本地安装pyzabbix模块。pyzabbix是一个第三方Python模块,提供了对Zabbix API的支持,可以帮助我们快速地访问Zabbix API。 可以通过pip在命令行安装pyzabbix模块: pip install pyzabbix 第一个脚本 – zabbix_scree…

    python 2023年6月3日
    00
  • Python:索引浮点数?

    【问题标题】:Python: indexing floats?Python:索引浮点数? 【发布时间】:2023-04-06 11:44:01 【问题描述】: 我有两组数据,我通过 Python 中的嵌套 for 循环读取它们。我需要使用一个公共数字(时间)匹配两个不同文本文件的行。在这两个文件中,时间的写法不同(例如 21:53:28.339 与 1210…

    Python开发 2023年4月6日
    00
  • Python中异常重试的解决方案详解

    Python中异常重试的解决方案详解 在Python编程中,我们总是会遇到各种各样的异常,比如网络异常、服务器异常等等。为了提高程序的健壮性和稳定性,我们可以采用异常重试的解决方案。本文就来详细讲解Python中异常重试的解决方案。 简介 异常重试的解决方案是在异常出现的时候,不是立即报错,而是进行重试,重复运行出现异常的那部分代码。这可以大大提高程序的健壮…

    python 2023年5月13日
    00
  • 查找两个NumPy数组的并集

    查找两个NumPy数组的并集可以通过将两个数组合并然后去重来实现。 以下是完整攻略: 创建两个NumPy数组 首先,我们需要创建两个NumPy数组。可以使用numpy.array()函数来创建。 import numpy as np array1 = np.array([1, 2, 3, 4, 5]) array2 = np.array([4, 5, 6, …

    python-answer 2023年3月25日
    00
  • Python中matplotlib中文乱码解决办法

    下面是关于“Python中matplotlib中文乱码解决办法”的完整攻略。 问题描述 在使用Matplotlib绘制图形时,中文字符出现了乱码,这是一个常见的问题。但是,这个问题的解决方法并不复杂,下面将为大家详细介绍。 解决方法 要解决这个问题,我们需要使用Matplotlib自带的rcParams属性来进行配置,具体步骤如下: 导入所需的库 impor…

    python 2023年5月20日
    00
  • python 函数、变量中单下划线和双下划线的区别详解

    Python 函数、变量中单下划线和双下划线的区别详解 在 Python 中,函数和变量名可以使用单下划线和双下划线来命名,这里详细讲解它们之间的区别。 单下划线 在 Python 中,单下划线 _ 通常用来表示一个变量或函数是私有的,即只能在模块内部使用。 示例: class MyClass: def __init__(self): self._priva…

    python 2023年6月3日
    00
合作推广
合作推广
分享本页
返回顶部