递归遍历方法展平多维嵌套列表、元组、字典所有值
递归遍历方法展平多维嵌套列表、元组、字典数据
问题背景:
平时在数据处理中,经常会遇到需要将多维嵌套的列表或元组类型数据进行展平,获得其中的各个元素,一两层的很好处理,但是嵌套层数多了就比较麻烦,通常处理方法是一层一层的剥开,,一层层判断,取出元素比较麻烦,往往会因此思考半天,甚至停滞不前,本文就是为了解决这个问题。
不妥之处,还请各位大佬多多点评指正,互相学习进步!
解决问题:
将多层嵌套的列表数据或元组数据,通过递归遍历方法提取出来,输出为一维的列表数据类型,实现多维嵌套列表、元组数据展平方法;
说明:
1、代码1只对列表、元组类型数据进行展平,字典类型不做处理;
2、代码2在代码1的基础上增加了对字典中所有值的处理方法,提取了字典中的所有值作为展开对象输出;
【展平多维嵌套列表、元组数据】的思路和方法与【遍历多维嵌套字典、列表、元组的数据查找指定键对应的值】的类似,直接上代码:
代码1:
1 # 展平多维嵌套列表、元组 2 3 # 测试嵌套列表 4 test_list1 = [1,['2','3','4'],[5,[6,7,8],[9]]] 5 test_list2 = [1,['2','3','4'],[5,(11,12,13),6,[7,8],[9]]] 6 test_list3 = [1,['2','3','4'],[5,(11,12,13),6,[(7,8)],(9)]] 7 test_list4 = [{'a':['1',2],'b':2},(1,2,[23,24,{'c':'cd'}],3),[4,[45,[456,(6,7,[8,{'d':'e'}])]]]] 8 9 10 def Flatten_List_And_Tuple(input_list,tmp_list): 11 # 判断输入是否为列表数据类型 12 if not isinstance(input_list,(list,tuple)) and not isinstance(tmp_list,list): 13 return "input_list:输入参数错误;tmp_list:输入参数错误" 14 15 # 列表剥层处理 16 for element in input_list: 17 # 数据类型不为列表、元组、字典时,则存入储存列表中 18 if not isinstance(element,(list,tuple)): 19 tmp_list.append(element) 20 21 # 数据类型为列表、元组时,回调本身,剥层处理 22 else: 23 Flatten_List_And_Tuple(element,tmp_list) 24 return tmp_list 25 26 print(Flatten_List_And_Tuple(test_list4,[]))
输出结果如下:
从代码上看,与上一篇思路和结构上极其相似。
代码2:
1 # 递归遍历展平列表、元组、字典所有值 2 def Flatten_dict_List_Tuple(input_list,tmp_list): 3 # 判断输入是否为列表数据类型 4 if not isinstance(input_list,(list,tuple)) and not isinstance(tmp_list,list): 5 return "input_list:输入参数错误;tmp_list:输入参数错误" 6 7 # 列表剥层处理 8 for element in input_list: 9 # 数据类型不为列表、元组、字典时,则存入储存列表中 10 if not isinstance(element,(list,tuple,dict)): 11 tmp_list.append(element) # 存入列表tmp_list中 12 13 # 数据类型为字典时,将字典的值传入,回调本身 14 elif isinstance(element,dict): 15 Flatten_dict_List_Tuple(element.values(),tmp_list) 16 17 # 数据类型为列表、元组时,回调本身 18 else: 19 Flatten_dict_List_Tuple(element,tmp_list) 20 return tmp_list 21 22 print(Flatten_dict_List_Tuple(test_list4,[]))
代码2输出结果如下:
将代码1稍作处理,即可实现对字典的所有值也进行展平!