码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2017-12-22 13:28:42      阅读:477      评论:0      收藏:0      [点我收藏+]

标签:app   16px   strong   嵌套   代码   gpo   需要   多重   自身   

接口返回json数据中可能嵌套列表,列表内又嵌套字典的情况,

接口自动化过程中需要通过一个key值直接获取到对应的value,所以有了下面的函数

不多说,上代码:

#! /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值是列表或者元组,则调用自身

 

效果图:

技术分享图片

上图对函数做了简单的测试,能从很复杂的多重嵌套数据中正常获取到想要的值

 

编写该函数时遇到的坑:

初始时,博主将存储获取数据的临时list放到了参数里面,这样调用时候就可以少传一个参数,

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

get_target(1)

但是后来发现,单次调用的时候不存在问题,但是多次调用的时候,会同时返回上一次调用的值,

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

技术分享图片

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

 

def foo(a=[])和 foo(a=[])的区别:前者是参数默认值,后者是keyword arguments

 

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

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

 

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

标签:app   16px   strong   嵌套   代码   gpo   需要   多重   自身   

原文地址:http://www.cnblogs.com/Detector/p/8085460.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!