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