繁体   English   中英

一键合并列表中的多个字典

[英]Merge multiple dicts in list on one key

我有一个字典列表

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

我希望 output 是这样的,

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

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

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

尝试:

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, ])

你可以试试

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])

那将 output

[[{'index': 20140, 'lang': 'tag4, tag, tag2'}],
 [{'index': 20416, 'lang': 'tag3, tag2, tag3'}],
 [{'index': 20594, 'lang': 'tag, tag4, tag5'}]]
>>> import itertools, operator
>>> key = operator.itemgetter("index")
>>> def func(lis):
...     return [dict([("index",g),("lang",",".join(x.get("lang") for x in val))]) for g,val in itertools.groupby(sorted(lis,key=key),key=key)]
>>> l = [[{'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'}]]
>>> [func(x) for x in l]
[[{'index': 20140, 'lang': 'tag4,tag,tag2'}], [{'index': 20416, 'lang': 'tag3,tag2,tag3'}], [{'index': 20594, 'lang': 'tag,tag4,tag5'}]]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM