首页 > 解决方案 > 展平其值具有嵌套字典列表的嵌套字典

问题描述

我有一个嵌套字典,其值可以包含嵌套字典列表 -

{ 'kw' : [{'@name': 'A', 
           'library': 'A1',
           'kw' : [{ '@name': 'B', 'lib': 'B1', 
                     'kw': [{ '@name': 'C' , 'extra' : 'C1'}],
                     'status': 'Fail'
                  }],
           'status': 'Pass'
         }]
}

我希望我的输出为 -

{ 'kw' : [{ '@name' : 'A',
            'library' : 'A1',
            'status'  : 'Pass'
          },
          {  '@name' : 'B'
             'lib' : 'B1',
             'status': 'Fail',
             'ref_kw_name': 'A'
          },
          {  '@name': 'C'
             'extra': 'C1',
             'ref_kw_name' : 'B'
          }]

在输出中,数据是扁平的、浅层的结构。字典的内部嵌套列表将包含“ref_kw_name”,该列表将具有父键“@name”的值。

标签: pythonpython-3.xlistdictionarynested

解决方案


input_dict = {'kw': [{'@name': 'A',
                      'library': 'A1',
                      'kw': [{'@name': 'B', 'lib': 'B1',
                              'kw': [{'@name': 'C', 'extra': 'C1'}],
                              'status': 'Fail'
                              }],
                      'status': 'Pass'
                      },
                     {'@name': 'AA',
                      'library': 'AA1',
                      'kw': [{'@name': 'BB', 'lib': 'BB1',
                               'kw': [{'@name': 'CC', 'extra': 'CC1'}],
                               'status': 'Fail'
                              }],
                      'status': 'Pass'
                      }]
              }


output_list = []
for item in input_dict['kw']:
    flatten = [item]
    done = False
    while not done:
        try:
            ref_kw_name = flatten[-1]['@name']
            data = flatten[-1]['kw']
            data[0]['ref_kw_name'] = ref_kw_name
            del flatten[-1]['kw']
            flatten += data
        except KeyError:
            done = True
    output_list += flatten

output = {'kw': output_list}

输出

{'kw': [{'@name': 'A', 'library': 'A1', 'status': 'Pass'},
  {'@name': 'B', 'lib': 'B1', 'status': 'Fail', 'ref_kw_name': 'A'},
  {'@name': 'C', 'extra': 'C1', 'ref_kw_name': 'B'},
  {'@name': 'AA', 'library': 'AA1', 'status': 'Pass'},
  {'@name': 'BB', 'lib': 'BB1', 'status': 'Fail', 'ref_kw_name': 'AA'},
  {'@name': 'CC', 'extra': 'CC1', 'ref_kw_name': 'BB'}]}

推荐阅读