[英]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.