如何使用递归的lamba函数遍历嵌套的python字典?

时间:2018-08-03 10:02:59

标签: python recursion lambda

我有一本类似下面的字典。我想遍历并创建多级层次结构索引DataFrame。

d={1e-06: {1: {'conv': [1, 2.0, 2.0, 1]},
         2: {'pool': [2.0, 2.0, 1, 1], 'stride': [1, 2.0, 2.0, 1]},
         3: {'conv': [1, 2.0, 2.0, 1]},
         4: {'pool': [2.0, 2.0, 1, 1], 'stride': [1, 2.0, 2.0, 1]}}, 
 1e-05: {1: {'conv': [1, 2.0, 2.0, 1]},
         2: {'pool': [2.0, 2.0, 1, 1], 'stride': [1, 2.0, 2.0, 1]}, 
         3: {'conv': [1, 2.0, 2.0, 1]}, 
         4: {'pool': [2.0, 2.0, 1, 1], 'stride': [1, 2.0, 2.0, 1]}}}

我正在研究一些方法,发现以下方法可行。

a_list=lambda d: [a_list(v) if isinstance(v,dict) else v for k,v in d.items()]

收益

pd.DataFrame(a_list(d))
                    0                                     1  \
0  [[1, 2.0, 2.0, 1]]  [[2.0, 2.0, 1, 1], [1, 2.0, 2.0, 1]]   
1  [[1, 2.0, 2.0, 1]]  [[2.0, 2.0, 1, 1], [1, 2.0, 2.0, 1]]   

                    2                                     3  
0  [[1, 2.0, 2.0, 1]]  [[2.0, 2.0, 1, 1], [1, 2.0, 2.0, 1]]  
1  [[1, 2.0, 2.0, 1]]  [[2.0, 2.0, 1, 1], [1, 2.0, 2.0, 1]] 

但是,我不确定这是否是匿名功能lambda安全使用。

这种用法有任何不当之处吗?

任何人都可以提供有关递归的lambda函数环境正在发生什么的任何详细信息吗?

更新

继续该策略,以下代码创建了多层次的DataFrame。

如果字典的嵌套复杂度增加,我仍然想知道 是否可能出现问题


代码

为多级索引创建元组

g = lambda d,q:[ g(v,q+[k]) if isinstance(v,dict) else {tuple(q+[k]):v} for 
k,v in d.items()]

取消透视多余的列

g1 = pd.DataFrame.from_dict(
        sum(            #flatten vertically
            sum(        #flatten horizontally
                g(d,[]),# call recursive lambda
                []),
            [])
     ).melt().dropna()  # unpivot

获取,创建,使用

g2 = list(g1['variable'])

index = pd.MultiIndex.from_tuples(g2)

g1.index = index

g1['value']

0.000001  1  conv      [1, 2.0, 2.0, 1]
          2  pool      [2.0, 2.0, 1, 1]
             stride    [1, 2.0, 2.0, 1]
          3  conv      [1, 2.0, 2.0, 1]
          4  pool      [2.0, 2.0, 1, 1]
             stride    [1, 2.0, 2.0, 1]
0.000010  1  conv      [1, 2.0, 2.0, 1]
          2  pool      [2.0, 2.0, 1, 1]
             stride    [1, 2.0, 2.0, 1]
          3  conv      [1, 2.0, 2.0, 1]
          4  pool      [2.0, 2.0, 1, 1]
             stride    [1, 2.0, 2.0, 1]

0 个答案:

没有答案