拼合嵌套字典,其值包含嵌套字典列表

时间:2020-06-30 03:55:34

标签: python python-3.x list dictionary nested

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

{ '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”的值。

1 个答案:

答案 0 :(得分:1)

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'}]}