在减少嵌套字典的同时保持字典结构

maintain dictionary structure while reducing nested dictionary

我有一个嵌套字典对列表 dd 并且想将结构维护到字典列表中:

dd = [
    [{'id': 'bla',
      'detail': [{'name': 'discard', 'amount': '123'},
                 {'name': 'KEEP_PAIR_1A', 'amount': '2'}]},
     {'id': 'bla2',
      'detail': [{'name': 'discard', 'amount': '123'},
                 {'name': 'KEEP_PAIR_1B', 'amount': '1'}]}
    ],
    [{'id': 'bla3',
      'detail': [{'name': 'discard', 'amount': '123'},
                 {'name': 'KEEP_PAIR_2A', 'amount': '3'}]},
     {'id': 'bla4',
      'detail': [{'name': 'discard', 'amount': '123'},
                 {'name': 'KEEP_PAIR_2B', 'amount': '4'}]}
    ]
]

我想将其缩减为成对词典的列表,同时只提取一些细节。例如,预期输出可能如下所示:

[{'name': ['KEEP_PAIR_1A', 'KEEP_PAIR_1B'], 'amount': [2, 1]},
 {'name': ['KEEP_PAIR_2A', 'KEEP_PAIR_2B'], 'amount': [3, 4]}]

我有 运行 我的代码:

pair=[]
for all_pairs in dd:
    for output_pairs in all_pairs:
        for d in output_pairs.get('detail'):
            if d['name'] != 'discard':
                pair.append(d)
output_pair = {
    k: [d.get(k) for d in pair]
    for k in set().union(*pair)
}

但它没有维护该结构:

{'name': ['KEEP_PAIR_1A', 'KEEP_PAIR_1B', 'KEEP_PAIR_2A', 'KEEP_PAIR_2B'],
 'amount': ['2', '1', '3', '4']}
                                                                                                                       

我假设我需要使用一些列表理解来解决这个问题,但是我应该在 for 循环中的什么地方这样做以维护结构。

由于您想在列表中组合字典,一种选择是使用 dict.setdefault:

pair = []
for all_pairs in dd:
    dct = {}
    for output_pairs in all_pairs:
        for d in output_pairs.get('detail'):
            if d['name'] != 'discard':
                for k,v in d.items():
                    dct.setdefault(k, []).append(v)
    pair.append(dct)

输出:

[{'name': ['KEEP_PAIR_1A', 'KEEP_PAIR_1B'], 'amount': [2, 1]},
 {'name': ['KEEP_PAIR_2A', 'KEEP_PAIR_2B'], 'amount': [3, 4]}]