在一个键上合并列表中的多个dict

2024-10-16 17:26:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一张单子

[[{'index': 20140, 'lang': 'tag4'},
  {'index': 20140, 'lang': 'tag'},
  {'index': 20140, 'lang': 'tag2'}],
 [{'index': 20416, 'lang': 'tag3'},
  {'index': 20416, 'lang': 'tag2'},
  {'index': 20416, 'lang': 'tag3'}],
 [{'index': 20594, 'lang': 'tag'},
  {'index': 20594, 'lang': 'tag4'},
  {'index': 20594, 'lang': 'tag5'}]]

我希望输出是这样的

[[{'index': 20140, 'lang': 'tag4, tag, tag2'}],
 [{'index': 20416, 'lang': 'tag3, tag2, tag3'}],
 [{'index': 20594, 'lang': 'tag, tag4, tag5'}]]

首先在列表的每个元素内的索引键上合并(注意,3 dicts=列表的1个元素),然后合并lang键的所有项

我无法生成任何有意义的代码


Tags: 代码元素列表langindextag单子意义
3条回答

你可以试试

new_dc = []
for i in dc:
         base_obj = {'index': i[0]['index'], 'lang': []}
         for y in i:
             base_obj['lang'].append(y['lang'])
         base_obj['lang'] = ", ".join(base_obj['lang'])
         new_dc.append([base_obj])

这将产生

[[{'index': 20140, 'lang': 'tag4, tag, tag2'}],
 [{'index': 20416, 'lang': 'tag3, tag2, tag3'}],
 [{'index': 20594, 'lang': 'tag, tag4, tag5'}]]

尝试:

from itertools import groupby

d=[[{'index': 20140, 'lang': 'tag4'},
  {'index': 20140, 'lang': 'tag'},
  {'index': 20140, 'lang': 'tag2'}],
 [{'index': 20416, 'lang': 'tag3'},
  {'index': 20416, 'lang': 'tag2'},
  {'index': 20416, 'lang': 'tag3'}],
 [{'index': 20594, 'lang': 'tag'},
  {'index': 20594, 'lang': 'tag4'},
  {'index': 20594, 'lang': 'tag5'}]]

def reduce_by_index(el):
    el=sorted(el, key=lambda x: x.get('index', -1))
    el=groupby(el, key=lambda x: x.get('index', -1))
    res=[]
    for k, v in el:
        res.append({'index': k, 'lang': ', '.join([x.get('lang', None) for x in v])})
    return res

d=list(map(reduce_by_index, d))

产出:

[[{'index': 20140, 'lang': 'tag4, tag, tag2'}], [{'index': 20416, 'lang': 'tag3, tag2, tag3'}], [{'index': 20594, 'lang': 'tag, tag4, tag5'}]]

也许不是最优的,但它应该是有效的

concatenated = list()
for collect in list_of_dicts:
    dct = dict()
    for d in list_of_dicts:
        for k, v in d.items():
            if k in dct:
                dct[k] += ', ' + v
            else:
                dct[k] = v
    concatenated.append([dct, ])

相关问题 更多 >