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

接口返回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)
时间: 2024-10-25 12:54:54

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

python基础-字典-列表-元组考试-day5

1.请用代码实现:利用下划线将列表的每一个元素拼接成字符串,li=['alex','eric','rain'] 1 li=['alex','eric','rain'] 2 v="_".join(li) 3 print(v) 执行结果: 1 alex_eric_rain 2.查找列表中元素,移除每个元素的空格,并查找以a或A开头并且以c结尾的所有元素.li=["alec","aric","Alex","Tony&quo

Python回顾与整理4:序列(字符串/列表/元组)

0.说明 序列其实是Python的某几类数据类型的统称,如字符串,列表和元组,将它们统称为序列,是因为:它们的成员有序排列,并且可以通过下标偏移量访问到它的一个或者几个成员. 总结的思路为:先介绍适用于所有序列类型的操作符和内建函数,然后再分别对这几种序列类型进行介绍. 1.序列 序列类型都有相同的访问模式:它的每一个元素都可以通过指定一个偏移量的方式得到,多个元素通过切片操作的方式得到.而在Python序列中,偏移量的规则如下(假设序列长度为N): (1)标准类型操作符 在<Python回顾与

Mysql DBA 高级运维学习笔记-DML之修改表中的数据实战

9.10 修改表中的数据 9.10.1 修改表中指定条件固定列的数据 1.命令语法:update 表名 set 字段=新值,-.where 条件(一定要注意条件) 2.修改指定的行字段的内容 a.查看要修改的表 [email protected] 02:3907->select * from test; +----+-----------+ | id | name | +----+-----------+ | 1 | wwnwan| | 2 | zbf | | 3 | lisi | | 4 |

PHP无限循环取MySQL中的数据。

最近公司有个需求需要从MySQL获取数据,然后在页面上无线循环的翻页展示.主要就是一直点击一个按钮,然后数据从最开始循环到末尾,如果末尾的数据不够了,那么从数据的最开始取几条补充上来. 其实,这个功能可以通过JS+PHP实现,也可以通过PHP + MYSQL+JS实现,只不过JS+PHP比较方便而且效率更高罢了. 下面是PHP + MYSQL+JS实现办法. 每次显示10条数据. 1 public function get_data($limit){ 2 $sql="select * from

python+selenium遍历某一个标签中的内容

一.python+selenium遍历某一个标签中的内容 举个例子:我要获取列表标签<li></li>的内容 根据python+selenium定位到列表整体,使用for循环获取列表文本:可用于校验列表是否存在你需要的文本内容 1.获取内容不包含嵌套层列表 给出代码: from selenium import webdriver import time d = webdriver.Chrome() d.maximize_window() # 窗口最大化###登录某网站 d.get(

Python文件遍历二种方法

分享下有关Python文件遍历的两种方法,使用的OS模块的os.walk和os.listdir实现. 关于Python的文件遍历,大概有两种方法,一种是较为便利的os.walk(),还有一种是利用os.listdir()递归遍历.方法一:利用os.walkos.walk可以自顶向下或者自底向上遍历整个文件树,然后返回一个含有3个元素的tuple,(dirpath, dirnames, filenames).注意,os.walk()会返回一个generater,所以调用的时候一定要放到for循环中

飘逸的python - 实现一个pretty函数美丽的输出嵌套字典

演示样例: d = { "root": { "folder2": { "item2": None, "item1": None }, "folder1": { "subfolder1": { "item2": None, "item1": None }, "subfolder2": { "item3": No

Python无限元素列表实例教程

有关Python中无限元素列表的实现方法. 本文实例讲述了Python怎么实现无限元素列表的方法,具体实现可使用Yield来完成.下面所述的2段实例代码通过Python Yield 生成器实现了简单的无限元素列表.(www.jbxue.com)1.递增无限列表具体代码:def increment(): i = 0 while True: yield i i += 1 for j in increment(): print i if (j > 10) : break 2.斐波那契无限列表具体代码:

Python递归遍历目录下所有文件

#自定义函数: import ospath="D:\\Temp_del\\a" def gci (path): parents = os.listdir(path) for parent in parents: child = os.path.join(path,parent) #print(child) if os.path.isdir(child): gci(child) # print(child) else: print(child) gci(path) #使用os.walk方