python利用递归去遍历多重dict
python中碰到多重dict,如下所示的双层dict,遍历里面的所有元素需要双重循环。现在为了代码美观,希望一句话就可以代替这样的双重for循环。
# 双重dict _dict = { 'A': { 'A1': [1, 2], 'A2': [3, 4] }, 'B': { 'B1': [21, 22], 'B2': [23, 24] } }
这里的一句话其实是调用一个递归实现的函数,来替代实现这样的多层for循环
# 递归实现多重for循环的函数 def fn(_dict, depth): for k, v in _dict.items(): if depth == 1: yield k, v else: yield from ((k, *q) for q in fn(v, depth - 1)) # 一句话遍历双重dict for k, v, x in fn(_dict, 2): print(k, v, x)
完整代码示例:双重dict与三重dict,一个递归函数代替多重for循环。达成功能:python使用递归函数来代替多重for循环,使得一句话可以遍历深层的dict。
# -*- coding:utf-8 -*- # 递归实现多重for循环的函数 def fn(_dict, depth): for k, v in _dict.items(): if depth == 1: yield k, v else: yield from ((k, *q) for q in fn(v, depth - 1)) # 双重dict _dict = { 'A': { 'A1': [1, 2], 'A2': [3, 4] }, 'B': { 'B1': [21, 22], 'B2': [23, 24] } } # 一句话遍历双重dict for k, v, x in fn(_dict, 2): print(k, v, x) print() print() # 三重dict _dict = { # 'A': { # 'A1': [1, 2], # 'A2': [3, 4] # }, # 'B': { # 'B1': [21, 22], # 'B2': [23, 24] # }, 'C': { 'C1': { 'c11': 'c11' }, 'C2': { 'c21': 'c21', 'c22': 'c22' } }, 'D': { 'D1': { 'd11': 123 } } } # 一句话遍历三重dict for k, v, x, y in fn(_dict, 3): print(k, v, x, y) print() print() # 土方法的三重循环,太丑了 for k1, v1 in _dict.items(): for k2, v2 in v1.items(): for k3, v3 in v2.items(): print(k1, k2, k3, v3)
A A1 [1, 2] A A2 [3, 4] B B1 [21, 22] B B2 [23, 24] C C1 c11 c11 C C2 c21 c21 C C2 c22 c22 D D1 d11 123 C C1 c11 c11 C C2 c21 c21 C C2 c22 c22 D D1 d11 123