假设我有两个字典列表。这些键的名称和编号相同。但是,值相同或不同。输出:合并值的字典列表。
list_a = [{'token_a': ['ab', 'cd', 'ef', 'hello', 'there']}, {'token_b': ['abc', 'rcd', 'gef', 'more', 'values']}]
list_b = [{'token_a': ['ab', 'cd', 'dfcdef']}, {'token_b': ['abc', 'rcd', 'jdhfgef']}]
预期输出:
output_list = [{'token_a': ['ab', 'cd', 'ef', 'dfcdef', 'hello', 'there']}, {'token_b': ['abc', 'rcd', 'gef', 'jdhfgef', 'more', 'values']}]
这是我尝试的: -定义合并一对字典的fn -然后,针对每个对(从两个列表中)在for循环中运行此fn。
def merge_pair_of_dicts(d1, d2):
final_values = []
merged_dict = {}
for k, v1 in d1.items():
for _, v2 in d2.items():
values = [v1 + v2]
values = [item for sublist in values for item in sublist]
final_values = list(set(values))
merged_dict = {k: final_values}
return merged_dict
zipped_lists = list(zip(list_a, list_b))
print(zipped_lists)
final_list_of_dicts = []
for dict_pair in zipped_lists:
d1 = dict_pair[0]
d2 = dict_pair[1]
merged_dict = merge_pair_of_dicts(d1, d2)
final_list_of_dicts.append(merged_dict)
print(final_list_of_dicts)
我上面的过程是可读的,可以完成工作。但是,有没有更好的方法可以合并两个字典列表呢?
答案 0 :(得分:3)
在单个列表理解和set
对象中:
list_a = [{'token_a': ['ab', 'cd', 'ef', 'hello', 'there']}, {'token_b': ['abc', 'rcd', 'gef', 'more', 'values']}]
list_b = [{'token_a': ['ab', 'cd', 'dfcdef']}, {'token_b': ['abc', 'rcd', 'jdhfgef']}]
res= [{k: list(set(v + list_b[i][k]))}
for i, d in enumerate(list_a) for k, v in d.items()]
print(res)
输出:
[{'token_a': ['ab', 'there', 'dfcdef', 'cd', 'ef', 'hello']}, {'token_b': ['more', 'jdhfgef', 'abc', 'values', 'gef', 'rcd']}]
答案 1 :(得分:2)
这是defaultdict的一个很好的例子。
from collections import defaultdict
dd = defaultdict(set)
for dct in list_a + list_b:
for key,value in dct.items():
dd[key] = list(set(dd[key]).union(set(value)))
结果
defaultdict(set,
{'token_a': ['ef', 'cd', 'dfcdef', 'ab'],
'token_b': ['jdhfgef', 'gef', 'abc', 'rcd']})
答案 2 :(得分:0)
一个班轮是
[{k: list(set(v+b.values()[0]))} for a in list_a for b in list_b for k,v in a.iteritems() if k in b.keys()]
结果:
[{'token_a': ['dfcdef', 'ab', 'ef', 'cd']},
{'token_b': ['rcd', 'abc', 'gef', 'jdhfgef']}]