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

原文链接:

http://www.cnblogs.com/Detector/p/8085460.html


背景

  接口自动化过程中,接口返回的为  列表字典循环嵌套  的数据,怎样通过一个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值是列表或者元组,则调用自身

效果图:

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

编写该函数时遇到的坑:

初始时,博主将存储获取数据的临时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)



猜你喜欢

转载自blog.csdn.net/detector_/article/details/79192114
今日推荐