无限遍历,Python实现在多维嵌套字典、列表、元组的JSON中获取数据
背景
在做接口自动化的过程中,接口返回的数据是 列表字典循环嵌套 格式的,所以怎样通过一个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_listelse:for 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)
转载于:https://www.cnblogs.com/Detector/p/8085460.html
无限遍历,Python实现在多维嵌套字典、列表、元组的JSON中获取数据相关推荐
- python中列表嵌套字典/列表排序,字典排序,列表排序。
列表排序 列表嵌套字典/列表排序 使用 lambda # 列表内多层嵌套,字典和列表 list_num = [{'name': '中国', 'uid': 10003, 'extinfo': {'tie ...
- python中字典列表元组_Python中的列表和元组
python中字典列表元组 Lists and tuples are arguably Python's most versatile, useful data types. You will fin ...
- 使用dom方式遍历文档||获取元素||从元素中获取数据
使用dom方式遍历文档 获取元素 根据id查询元素getElementById 根据标签获取元素getElementsByTag 根据class获取元素getElementsByClass 根据属性获 ...
- python临床数据_从临床试验中获取数据
我正在开发一个小Python函数来从clinicalTrials.gov中获取数据.从每个研究记录中,我想从中找出研究的目标条件.例如,对于this研究记录,我需要以下内容:conditions = ...
- python 从excel中抓取数据_python接口自动化(三)——从excel中获取数据
python接口自动化(三)--从excel中获取数据 1.按照之前的设计思路,我们需要从excel中去获取测试用例,所我们先封装一个获取数据的工具 from Data.with_config imp ...
- python 字典列表,元组列表 列表嵌套字典 列表嵌套元组 字典嵌套列表
列表嵌套字典 l=[] for i in alist:kk = {}names.append(i.string)a_url.append(i.get('href'))kk['章节名']=i.strin ...
- python dataframe取一列_python - 从pandas DataFrame列标题中获取列表
python - 从pandas DataFrame列标题中获取列表 我想从pandas DataFrame中获取列标题列表. DataFrame将来自用户输入,因此我不知道将会有多少列或将调用它们. ...
- python基础之序列类型的方法——列表元组
Python微信订餐小程序课程视频 https://edu.csdn.net/course/detail/36074 Python实战量化交易理财系统 https://edu.csdn.net/cou ...
- python中元祖 字典 列表的区别_Python中元祖,列表,字典的区别
原博文 2016-08-16 15:25 − Python中有3种內建的数据结构:列表.元祖和字典: 1.列表 list是处理一组有序项目的数据结构,即你可以在一个列表中存储一个序列的项目. 列表中的 ...
最新文章
- 值得深思的问题——分库分表就能无限扩容吗?
- REPLICAT RORA_1保持 ABENDED状态,无法启动问题处理
- 从xib 创建 collectionViewCell
- pyqt5与matplotlib结合画图 ,绘制动态图形
- mysql 如何添加索引_MySQL如何创建一个好索引?创建索引的5条建议【宇哥带你玩转MySQL 索引篇(三)】...
- 转(HP大中华区总裁孙振耀退休感言)
- Java使用笔记之stream和sorted使用
- Python 安装pytz
- 基于三菱FX系列与扫码枪232的通讯
- 浅谈Suffix Automaton(后缀自动机)
- 050_Scrapy 爬虫框架 案例四大名著爬取
- systemverilog:always_comb、always_latch、always_ff区别
- 【读书笔记】《码农翻身》——一本差点被书名耽误的好书
- 我们如何获取信息,组织知识
- BGP路由属性和选路
- 惊!Go里面居然有这样精妙的小函数!
- java常见正则表达式用法
- 微信好友删除了怎么找回来
- delphi10.2的Date/time 实用程序单元DateUtils.pas
- php小偷替换代码,收藏的一个php小偷的核心程序
热门文章
- java 创建string对象机制 字符串缓冲池 字符串拼接机制 字符串中intern()方法...
- 设计模式---装饰模式
- Spring Data JPA 条件查询的关键字
- Ubuntu14.04安装pip及配置
- 【自然框架之SSO】实现SSO的一个初步想法
- ubuntu8.0中文输入法
- 雅虎将于4月底关闭自助式广告测试
- (原) Data Blocks, Extents, and Segments
- ORA-39083: + ORA-00439: 未启用功能
- 摩尔定律会死亡吗 芯片到底可以变得有多小