1. 程式人生 > >python無限遍歷,實現在多維嵌套字典、列表、元組的JSON中獲取數據

python無限遍歷,實現在多維嵌套字典、列表、元組的JSON中獲取數據

發現 多維 自身 argument 可能 嵌套列表 自動 bing 後來

接口返回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中獲取數據