无限遍历,Python实现在多维嵌套字典、列表、元组的JSON中获取数据
2017-12-22 12:39
836 查看
背景
接口自动化过程中,接口返回的为 列表字典循环嵌套 的数据,怎样通过一个key值,直接获取到被包裹多层的数据成为了摆在我面前的一个问题,为此,我在某度上面进行了搜索,发现很多人遇到类似的问题,但是解决方案都不够完善,不能达到我想要的结果,所以自己尝试写了一个
思路
开始时的想法是,对数据类型进行判断,然后做对应的处理,但是发现如果这样,实际数据有多少层就要做多少次判断,有没有一劳永逸的方法呢?调试过程中,发现函数的调用特别符合递归的规律,通过两个函数递归相互调用的方法可以完美解决这个问题!
如果为字典,则调用字典处理函数;
如果是列表或者元组,则调用列表处理函数;
如果当前数据类型与当前处理函数相同,则调用自身,一直到遍历所有数据
示例代码
不多说,上代码,注释已经写得比较清晰:#! /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_list else: 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_value return tmp_list def _get_value(key, val, tmp_list): for val_ in val: if isinstance(val_, dict): get_target_value(key, val_, tmp_list) # 传入数据的value值是字典,则调用get_target_value elif 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)
后来查了很多资料了解到,参数默认值,只会在函数声明时初始化一次,之后不会再初始化
下面这段代码定义和调用也是存在细微差别的
def foo(*args, **kargs): pass foo(*args, **kargs)
相关文章推荐
- [置顶] 无限遍历,python实现在多维嵌套字典、列表、元组的JSON中获取数据
- 无限遍历,python实现在多维嵌套字典、列表、元组的JSON中获取数据
- Python多维/嵌套字典数据无限遍历的实现
- Python多维/嵌套字典数据无限遍历
- Python多维/嵌套字典数据无限遍历
- Python多维/嵌套字典数据无限遍历
- Python 3从入门到精通14-常见的数据类型字符串元组,列表,字典
- python实现嵌套列表、字典按某一元素去重复
- Python数据类型(元组、列表、字符串、字典)
- 把CSV数据合成json样书存入字典、列表并打印的python脚本
- Python多维/嵌套字典数据无限遍历的实现
- Python实现对嵌套列表字典按某一元素合并及lambda的使用
- Python3组合数据类型(元组、列表、集合、字典)语法
- jQuery实现在下拉列表选择时获取json数据的方法
- 把CSV数据合成json样书存入字典、列表并打印的python脚本
- python实操(5):python数据类型及常用操作,数字、字符串、元组、列表、字典、集合
- 一句python,一句R︱列表、元组、字典、数据类型、自定义模块导入(格式、去重)
- Python中数据结构 列表 元组 字典 序列
- python学习笔记--打印嵌套list中每个数据(遍历列表)
- 用Ajax实现多级联动下拉列表For JSP(无限级别,JSON传输数据,含全国地区数据库