如何在Python中迭代动态“深度”的字典?

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 子句。

谢谢。

Ale*_*lli 5

我不确定为什么每个人都在考虑递归(或递归消除)——我只是执行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)。