【问题标题】:To flatten the nested dictionary whose value has list of nested dictionaries [closed]展平其值具有嵌套字典列表的嵌套字典[关闭]
【发布时间】:2020-06-30 03:55:34
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案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'}]}
    

    【讨论】:

    • 如果字典内部列表的数量更多,则此代码将不起作用
    • 使用 for 循环。您可以遍历所有内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 2019-05-09
    • 2019-05-03
    • 1970-01-01
    • 2019-11-15
    • 2012-09-06
    相关资源
    最近更新 更多