Mus*_*ov1 2 python iteration algorithm dictionary
我有一个具有各种“深度”的字典数据结构。我所说的“深度”是指:当深度为 1 时,dict 将类似于:
{'str_key1':int_value1, 'str_key2:int_value2}
Run Code Online (Sandbox Code Playgroud)
当深度为2时,dict将是这样的:
{'str_key1':
{'str_key1_1':int_value1_1,
'str_key1_2':int_value1_2},
'str_key2':
{'str_key2_1':int_value2_1,
'str_key2_2':int_value2_2} }
Run Code Online (Sandbox Code Playgroud)
等等等等。
当我需要处理数据时,现在我这样做:
def process(keys,value):
#do sth with keys and value
pass
def iterate(depth,dict_data):
if depth == 1:
for k,v in dict_data:
process([k],v)
if depth == 2:
for k,v in dict_data:
for kk,vv, in v:
process([k,kk],v)
if depth == 3:
.........
Run Code Online (Sandbox Code Playgroud)
所以当深度为n时我需要n 个for 循环。由于深度可以达到 10,我想知道是否有一种更动态的方式来进行迭代,而不必写出所有的 if 和 for 子句。
谢谢。
我不确定为什么每个人都在考虑递归(或递归消除)——我只是执行depth
步骤,每个步骤都通过向下一级扩展来重建列表。
例如:
def itr(depth, d):
cp = [([], d)]
for _ in range(depth):
cp = [(lk+[k], v) for lk, d in cp for k, v in d.items()]
for lk, ad in cp:
process(lk, ad)
Run Code Online (Sandbox Code Playgroud)
如果出于教学目的需要使其更具可读性,则可以使用更长的标识符和更低的代码密度轻松“扩展”,但我认为逻辑足够简单,可能不需要这样的处理(而且,冗长本身也有其缺点, 也;-)。
例如:
d = {'str_key1':
{'str_key1_1':'int_value1_1',
'str_key1_2':'int_value1_2'},
'str_key2':
{'str_key2_1':'int_value2_1',
'str_key2_2':'int_value2_2'} }
def process(lok, v):
print lok, v
itr(2, d)
Run Code Online (Sandbox Code Playgroud)
印刷
['str_key2', 'str_key2_2'] int_value2_2
['str_key2', 'str_key2_1'] int_value2_1
['str_key1', 'str_key1_1'] int_value1_1
['str_key1', 'str_key1_2'] int_value1_2
Run Code Online (Sandbox Code Playgroud)
(如果需要某种特定的顺序,当然可以对 进行适当的排序cp
)。