Python 合并两个目录列表

Python 合并两个目录列表,python,dictionary,Python,Dictionary,假设我有两个字典列表。钥匙的名称和数量相同。但是,这些值要么相同,要么不同。输出:合并值的目录列表 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']}

假设我有两个字典列表。钥匙的名称和数量相同。但是,这些值要么相同,要么不同。输出:合并值的目录列表

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']}]
这就是我所尝试的: -def合并一对dict的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)

我的上述程序是可读的,将做的工作。但是,有没有更好的方法可以在一个列表理解和设置对象中合并两个dict列表?

输出:

[{'token_a': ['ab', 'there', 'dfcdef', 'cd', 'ef', 'hello']}, {'token_b': ['more', 'jdhfgef', 'abc', 'values', 'gef', 'rcd']}]

在单个列表和集合对象中:

输出:

[{'token_a': ['ab', 'there', 'dfcdef', 'cd', 'ef', 'hello']}, {'token_b': ['more', 'jdhfgef', 'abc', 'values', 'gef', 'rcd']}]

这是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']})

这是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']})
一艘班轮是

[{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']}]
一艘班轮是

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

如果相应的值没有像abc->dfe这样的公共字符?结果应该是什么?相应地编辑了我的问题。值列表的长度可以不同。任务是合并两个列表并只保留不同的值。如果相应的值没有像abc->dfe这样的公共字符?结果应该是什么?相应地编辑了我的问题。值列表的长度可以不同。任务是合并两个列表并仅保留不同的值。OP的条件:合并两个列表并仅保留不同的值。@RomanPerekhrest感谢您的更正。我修改了solutionOP的条件:合并两个列表,只保留不同的值。@RomanPerekhrest感谢您的更正。我调整了我的解决方案您的输出与预期输出略有不同。列表中的每一项都必须是单独的目录。尽管如此,我还是喜欢它。@user1717931,对不起,这很容易修复,现在已经修复,请参阅更新如果有两个以上的列表,如z=[list_a,list_b,list_c,list_d,list_e],您将如何更改列表理解而不是硬编码每个列表名称?您的输出和预期的输出略有不同。列表中的每一项都必须是单独的目录。尽管如此,我还是喜欢它。@user1717931,对不起,这很容易修复,现在已经修复,请参阅更新如果有两个以上的列表,如z=[list_a,list_b,list_c,list_d,list_e],您将如何改变对列表的理解,而不是硬编码每个列表名?