当前位置: 首页 > news >正文

无限遍历,Python实现在多维嵌套字典、列表、元组的JSON中获取数据

目录

背景

思路

新建两个函数A和B,函数 A处理字典数据,被调用后,判断传递的参数,如果参数为字典,则调用自身;

如果是列表或者元组,则调用列表处理函数B;

函数 B处理列表,被调用后,判断传递的参数,如果参数为列表或者元组,则调用自身;

如果是字典,则调用字典处理函数A;

参考代码

效果图

调试过程中遇到的坑

资料获取方法


背景

在做接口自动化的过程中,接口返回的数据是  列表字典循环嵌套  格式的,所以怎样通过一个key值,获取到被包裹了多层的目标数据成为了摆在我面前的一个问题。

一开始没想自己写,但是搜索后发现虽然很多人遇到类似的问题,但是相应的解决方案都不能达到我想要的结果,所以自己尝试写了一个。

思路

最初的做法是写一个函数,每次对传入的数据进行类型判断,然后根据数据类型做对应的处理,后来发现如果这样,实际有多少层数据就要做多少次判断。

那么有没有一劳永逸的方法呢?答案当然是有!

调试过程中发现,函数的调用特别符合递归的规律,但是和一般递归的略有不同,需要两个函数相互调用递归。实测可以完美解决这个问题!

具体思路如下:

新建两个函数A和B,函数 A处理字典数据,被调用后,判断传递的参数,如果参数为字典,则调用自身;

如果是列表或者元组,则调用列表处理函数B;

函数 B处理列表,被调用后,判断传递的参数,如果参数为列表或者元组,则调用自身;

如果是字典,则调用字典处理函数A;

参考代码

注释已经写得比较清晰,就不多解释了:

#! /usr/bin/python
# coding:utf-8 
""" 
@author:Bingo.he 
@file: get_target_value.py 
@time: 2017/12/22 
"""
def get_target_value(key, dic, tmp_list):""":param key: 目标key值:param dic: JSON数据:param tmp_list: 用于存储获取的数据:return: list"""if not isinstance(dic, dict) or not isinstance(tmp_list, list):  # 对传入数据进行格式校验return 'argv[1] not an dict or argv[-1] not an list 'if key in dic.keys():tmp_list.append(dic[key])  # 传入数据存在则存入tmp_listfor value in dic.values():  # 传入数据不符合则对其value值进行遍历if isinstance(value, dict):get_target_value(key, value, tmp_list)  # 传入数据的value值是字典,则直接调用自身elif isinstance(value, (list, tuple)):_get_value(key, value, tmp_list)  # 传入数据的value值是列表或者元组,则调用_get_valuereturn tmp_listdef _get_value(key, val, tmp_list):for val_ in val:if isinstance(val_, dict):  get_target_value(key, val_, tmp_list)  # 传入数据的value值是字典,则调用get_target_valueelif isinstance(val_, (list, tuple)):_get_value(key, val_, tmp_list)   # 传入数据的value值是列表或者元组,则调用自身

效果图

下图对对这个方法做了测试,能从很复杂的多重嵌套数据中正常获取到想要的值,测试数据:

test_dic = {'a': '1', 'b': '2', 'c': {'d': [{'e': [{'f': [{'v': [{'g': '6'}, [{'g': '7'}, [{'g': 8}]]]}, 'm']}]}, 'h', {'g': [10, 12]}]}}

调试过程中遇到的坑

初始时,博主将存储获取数据的临时list放到了函数的参数里,这样调用时候就可以少传一个参数,但是后来发现,单次调用的时候不存在问题,但是多次调用的时候,会同时返回上一次调用的值,

这可能是python函数本身的一个bug

def get_target(a, b=[]):b.append(a)print(b)get_target(1)
get_target(2)

后来查了很多资料了解到,参数默认值,只会在函数声明时初始化一次,之后不会再初始化

下面这段代码定义和调用也是存在细微差别的

def foo(*args, **kargs):passfoo(*args, **kargs)

资料获取方法

【留言777】

各位想获取源码等教程资料的朋友请点赞 + 评论 + 收藏,三连!

三连之后我会在评论区挨个私信发给你们~

相关文章:

无限遍历,Python实现在多维嵌套字典、列表、元组的JSON中获取数据

目录 背景 思路 新建两个函数A和B,函数 A处理字典数据,被调用后,判断传递的参数,如果参数为字典,则调用自身; 如果是列表或者元组,则调用列表处理函数B; 函数 B处理列表&#x…...

信息学奥赛一本通——1180:分数线划定

文章目录 题目【题目描述】【输入】【输出】【输入样例】【输出样例】【提示】 AC代码 题目 【题目描述】 世博会志愿者的选拔工作正在 A 市如火如荼的进行。为了选拔最合适的人才,A市对所有报名的选手进行了笔试,笔试分数达到面试分数线的选手方可进入…...

SpringApplication对象的构建及spring.factories的加载时机

构建SpringApplication对象源码: 1、调用启动类的main()方法,该方法中调用SpringApplication的run方法。 SpringBootApplication public class SpringbootdemoApplication {public static void main(String[] args) {SpringApplication.run(SpringbootdemoApplication.class, …...

基于传统检测算法hog+svm实现图像多分类

直接上效果图: 代码仓库和视频演示b站视频005期: 到此一游7758258的个人空间-到此一游7758258个人主页-哔哩哔哩视频 代码展示: 数据集在datasets文件夹下 运行01train.py即可训练 训练结束后会保存模型在本地 运行02pyqt.py会有一个可视化…...

slice() 方法,使用 concat() 方法, [...originalArray],find(filter),移出类名 removeAttr()

在JavaScript中,在 JavaScript 中,clone 不是一个原生的数组方法。但是你可以使用其他方法来实现克隆数组的功能。 以下是几种常见的克隆数组的方法: 使用 slice() 方法: const originalArray [1, 2, 3]; const clonedArray …...

Zabbix报警机制、配置钉钉机器人、自动发现、主动监控概述、配置主动监控、zabbix拓扑图、nginx监控实例

day02 day02配置告警用户数超过50,发送告警邮件实施验证告警配置配置钉钉机器人告警创建钉钉机器人编写脚本并测试添加报警媒介类型为用户添加报警媒介创建触发器创建动作验证自动发现配置自动发现主动监控配置web2使用主动监控修改配置文件,只使用主动…...

ELK日志分析系统概述及部署

ELK 平台是一套完整的日志集中处理解决方案,将 ElasticSearch、Logstash 和 Kibana 三个开源工具配合使用,完成更强大的用户对日志的查询、排序、统计需求。 一、ELK概述 1、组件说明 ①ElasticSearch ElasticSearch是基于Lucene(一个全文…...

HTML拖拽

拖拽的流程:鼠标按下(mousedown)→鼠标移动(mousemove)→鼠标松开(moveup) 需要理解的几个api: clientX/clientY: 相对于浏览器视窗内的位置坐标(不包括浏览器收藏夹和顶部网址部分)pageX/pageY: 该属性会考虑滚动,如…...

【vue】 vue2 监听滚动条滚动事件

代码 直接上代码&#xff0c;vue单文件 index.vue <template><div class"content" scroll"onScroll"><p>内容</p><p>内容</p><p>内容</p><p>内容</p><p>内容</p><p>内容…...

k8s目录

k8s笔记目录&#xff0c;更新中... 一 概念篇 1.1概念介绍 1.2 pod 1.3 controller 1.3.1 deployment 1.3.2 statefulset 1.3.3 daemonset 1.3.4 job和cronJob1 1.4 serivce和ingress 1.5 配置与存储 1.5.1 configMap 1.5.2 secret 1.5.3 持久化存储 1.5.4 pv和…...

设计模式行为型——解释器模式

目录 什么是解释器模式 解释器模式的实现 解释器模式角色 解释器模式类图 解释器模式举例 解释器模式代码实现 解释器模式的特点 优点 缺点 使用场景 注意事项 实际应用 什么是解释器模式 解释器模式&#xff08;Interpreter Pattern&#xff09;属于行为型模式&…...

使用 Webpack 优化前端开发流程

在现代前端开发中&#xff0c;构建工具的选择和优化流程的设计至关重要。Webpack 是一个功能强大的前端构建工具&#xff0c;能够优化我们的开发流程&#xff0c;提高开发效率和项目性能。本文将介绍如何使用 Webpack 来优化前端开发流程。 代码优化和资源管理也是前端项目中不…...

mysql的分库分表脚本

目录 一.分库分表优点二.过程思路脚本实现验证 一.分库分表优点 1&#xff0c;提高系统的可扩展性和性能&#xff1a;通过分库分表&#xff0c;可以将数据分布在多个节点上&#xff0c;从而提高系统的负载能力和处理性能。 2&#xff0c;精确备份和恢复&#xff1a;分库分表备…...

JavaEE初阶之文件操作 —— IO

目录 一、认识文件 1.1认识文件 1.2树型结构组织 和 目录 1.3文件路径(Path) 1.4其他知识 二、Java 中操作文件 2.1File 概述 2.2代码示例 三、文件内容的读写 —— 数据流 3.1InputStream 概述 ​3.2FileInputStream 概述 3.3代码示例 3.4利用 Scanner 进行字…...

客户端代码 VS 服务端代码 简述

客户端代码和服务端代码是计算机网络交互中的两种重要代码类型。在计算机网络中&#xff0c;客户端和服务器是一对设备模型&#xff0c;客户端&#xff08;Client&#xff09;负责向服务器发送请求&#xff0c;服务器&#xff08;Server&#xff09;负责处理请求并返回给客户端…...

【娱乐圈明星知识图谱2】信息抽取

目录 1. 项目介绍 2. 信息抽取介绍 3. ChatGPT 信息抽取代码实战 4. 信息抽取主逻辑 5. 项目源码 1. 项目介绍 利用爬虫项目中爬取的大量信息 【娱乐圈明星知识图谱1】百科爬虫_Encarta1993的博客-CSDN博客娱乐圈明星知识图谱百度百科爬虫百度百科爬虫百度百科爬虫百度百…...

C++ rand的用法

C rand的用法 rand()介绍srand()介绍产生随机数的用法产生一定范围随机数的通用表示公式 我们知道 rand() 函数可以用来产生随机数&#xff0c;但是这不是真正意义上的随机数&#xff0c;是一个伪随机数&#xff0c;是根据一个数&#xff08;我们可以称它为种子&#xff09;为基…...

element时间选择器的默认值

概览&#xff1a;vue使用element组件&#xff0c;需要给时间选择器设置默认值&#xff0c;场景一&#xff1a;默认时间选择器&#xff0c;场景二&#xff1a;时间范围选择器&#xff0c;开始时间和结束时间。 一、默认时间选择器 实现思路&#xff1a; element组件的v-model绑…...

fiddler过滤器

1、fiddler Fiddler是一个免费、强大、跨平台的HTTP抓包工具。下载地址 2、为什么适用过滤器 不适用过滤器时&#xff0c;所有的报文都会被抓包。 我们在开发或测试时&#xff0c;只需要抓包某个域名下的报文 &#xff0c;以“www.baidu.com”为例&#xff0c;不设置过滤器&…...

面试必考精华版Leetcode2130.链表最大孪生和

题目&#xff1a; 代码&#xff08;首刷看解析 day22&#xff09;&#xff1a; class Solution { public:int pairSum(ListNode* head) {ListNode* slowhead;ListNode* fasthead->next;while(fast->next!nullptr){slowslow->next;fastfast->next->next;}//反转…...

HY-Motion 1.0作品集展示:12类日常动作+8类专业运动生成效果

HY-Motion 1.0作品集展示&#xff1a;12类日常动作8类专业运动生成效果 1. 引言&#xff1a;当文字能驱动骨骼 想象一下&#xff0c;你正在为一个游戏角色设计一套连贯的格斗动作&#xff0c;或者为一个虚拟主播编排一段自然的舞蹈。传统流程需要动画师一帧一帧地调整骨骼&am…...

SWIFT报文格式规范:从字符约束到金融交易安全的深度解析

1. SWIFT报文格式规范的核心价值 第一次接触SWIFT报文时&#xff0c;我被那些看似简单的字母代号震撼到了——谁能想到&#xff0c;像"2!n"这样简单的符号组合&#xff0c;竟然承载着全球金融系统的运转规则&#xff1f;在跨境汇款中输错一个字符可能导致资金滞留数周…...

精选 Skills 推荐:10 个让 Coding Agent 如虎添翼的Skills + 优质来源分享

精选 Skills 推荐&#xff1a;10 个让 Coding Agent 如虎添翼的Skills 优质来源分享 本篇是 Vibecoding 系列教程 的工具导向专题篇。 前篇&#xff1a;进阶教程&#xff08;一&#xff09;&#xff1a;MCP Skills 让 coding agent 有自己的工具系列合集&#xff1a;Vibecodi…...

掌握高效自动化抢票:3个专业策略突破90%成功率瓶颈

掌握高效自动化抢票&#xff1a;3个专业策略突破90%成功率瓶颈 【免费下载链接】ticket-purchase 大麦自动抢票&#xff0c;支持人员、城市、日期场次、价格选择 项目地址: https://gitcode.com/GitHub_Trending/ti/ticket-purchase 大麦自动抢票开源工具是一款基于Sele…...

BiliBiliCCSubtitle:3分钟掌握B站字幕下载与格式转换的终极指南

BiliBiliCCSubtitle&#xff1a;3分钟掌握B站字幕下载与格式转换的终极指南 【免费下载链接】BiliBiliCCSubtitle 一个用于下载B站(哔哩哔哩)CC字幕及转换的工具; 项目地址: https://gitcode.com/gh_mirrors/bi/BiliBiliCCSubtitle 你是否经常需要从B站视频中提取字幕内…...

Linux安装中文+MySQL的详细过程

中文安装1. 清理环境变量打开终端执行&#xff1a;sed -i /fcitx/d ~/.bashrcsed -i /GTK_IM_MODULE/d ~/.bashrcsed -i /QT_IM_MODULE/d ~/.bashrcsed -i /XMODIFIERS/d ~/.bashrc2. 重新配置 ibus 环境变量echo export GTK_IM_MODULEibus >> ~/.bashrcecho export QT_I…...

别等宕机才后悔!UPS蓄电池定期巡检,这4点才是核心!

&#xff5c;机房里设备林立&#xff0c;大多数人把目光聚焦在服务器、精密空调上。但其实&#xff0c;潜伏在机房角落的“隐形杀手”&#xff0c;往往是看起来默默无闻的UPS蓄电池。今天我们不谈复杂的技术参数&#xff0c;只用大白话讲清楚&#xff1a;为什么蓄电池必须定期巡…...

Ubuntu 24.04 内核 Kernel Panic 问题排查与解决流程(第二次出现该问题后,永久性解决)

问题描述 系统更新后重启&#xff0c;出现以下错误&#xff1a; Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)系统无法正常启动。问题原因分析 错误含义 内核在启动过程中无法找到并挂载根文件系统。unknown-block(0,0) 表示内核完全不知道…...

GLM-4.1V-9B-Base应用场景:零售货架图像识别与SKU自动盘点方案

GLM-4.1V-9B-Base应用场景&#xff1a;零售货架图像识别与SKU自动盘点方案 1. 零售行业面临的库存管理挑战 走进任何一家超市或便利店&#xff0c;你都会看到整齐排列的商品货架。但你可能不知道的是&#xff0c;这些看似简单的货架背后隐藏着一个巨大的管理难题 - 库存盘点。…...

Krita 5.3.0 与 6.0.0 发布:功能升级与技术革新

文本与工具革新&#xff0c;Krita 功能升级Krita 5.3.0 和 6.0.0 正式推出&#xff0c;带来了一系列显著的功能改进。文本工具被完全重写&#xff0c;支持在画布上进行所见即所得编辑&#xff0c;还能支持 OpenType 的所有特性以及文本置入形状&#xff0c;这大大提升了文字处理…...