背景

在做接口自动化的过程中,接口返回的数据是  列表字典循环嵌套  格式的,所以怎样通过一个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中获取数据相关推荐

  1. python中列表嵌套字典/列表排序,字典排序,列表排序。

    列表排序 列表嵌套字典/列表排序 使用 lambda # 列表内多层嵌套,字典和列表 list_num = [{'name': '中国', 'uid': 10003, 'extinfo': {'tie ...

  2. python中字典列表元组_Python中的列表和元组

    python中字典列表元组 Lists and tuples are arguably Python's most versatile, useful data types. You will fin ...

  3. ​​​​​​​​​​​​​​使用dom方式遍历文档||获取元素||从元素中获取数据

    使用dom方式遍历文档 获取元素 根据id查询元素getElementById 根据标签获取元素getElementsByTag 根据class获取元素getElementsByClass 根据属性获 ...

  4. python临床数据_从临床试验中获取数据

    我正在开发一个小Python函数来从clinicalTrials.gov中获取数据.从每个研究记录中,我想从中找出研究的目标条件.例如,对于this研究记录,我需要以下内容:conditions = ...

  5. python 从excel中抓取数据_python接口自动化(三)——从excel中获取数据

    python接口自动化(三)--从excel中获取数据 1.按照之前的设计思路,我们需要从excel中去获取测试用例,所我们先封装一个获取数据的工具 from Data.with_config imp ...

  6. python 字典列表,元组列表 列表嵌套字典 列表嵌套元组 字典嵌套列表

    列表嵌套字典 l=[] for i in alist:kk = {}names.append(i.string)a_url.append(i.get('href'))kk['章节名']=i.strin ...

  7. python dataframe取一列_python - 从pandas DataFrame列标题中获取列表

    python - 从pandas DataFrame列标题中获取列表 我想从pandas DataFrame中获取列标题列表. DataFrame将来自用户输入,因此我不知道将会有多少列或将调用它们. ...

  8. python基础之序列类型的方法——列表元组

    Python微信订餐小程序课程视频 https://edu.csdn.net/course/detail/36074 Python实战量化交易理财系统 https://edu.csdn.net/cou ...

  9. python中元祖 字典 列表的区别_Python中元祖,列表,字典的区别

    原博文 2016-08-16 15:25 − Python中有3种內建的数据结构:列表.元祖和字典: 1.列表 list是处理一组有序项目的数据结构,即你可以在一个列表中存储一个序列的项目. 列表中的 ...

最新文章

  1. 值得深思的问题——分库分表就能无限扩容吗?
  2. REPLICAT RORA_1保持 ABENDED状态,无法启动问题处理
  3. 从xib 创建 collectionViewCell
  4. pyqt5与matplotlib结合画图 ,绘制动态图形
  5. mysql 如何添加索引_MySQL如何创建一个好索引?创建索引的5条建议【宇哥带你玩转MySQL 索引篇(三)】...
  6. 转(HP大中华区总裁孙振耀退休感言)
  7. Java使用笔记之stream和sorted使用
  8. Python 安装pytz
  9. 基于三菱FX系列与扫码枪232的通讯
  10. 浅谈Suffix Automaton(后缀自动机)
  11. 050_Scrapy 爬虫框架 案例四大名著爬取
  12. systemverilog:always_comb、always_latch、always_ff区别
  13. 【读书笔记】《码农翻身》——一本差点被书名耽误的好书
  14. 我们如何获取信息,组织知识
  15. BGP路由属性和选路
  16. 惊!Go里面居然有这样精妙的小函数!
  17. java常见正则表达式用法
  18. 微信好友删除了怎么找回来
  19. delphi10.2的Date/time 实用程序单元DateUtils.pas
  20. php小偷替换代码,收藏的一个php小偷的核心程序

热门文章

  1. java 创建string对象机制 字符串缓冲池 字符串拼接机制 字符串中intern()方法...
  2. 设计模式---装饰模式
  3. Spring Data JPA 条件查询的关键字
  4. Ubuntu14.04安装pip及配置
  5. 【自然框架之SSO】实现SSO的一个初步想法
  6. ubuntu8.0中文输入法
  7. 雅虎将于4月底关闭自助式广告测试
  8. (原) Data Blocks, Extents, and Segments
  9. ORA-39083: + ORA-00439: 未启用功能
  10. 摩尔定律会死亡吗 芯片到底可以变得有多小