如何优雅地将键相同且值为列表的字典列表合并为单个字典
这题我熟!这种批量合并字典、合并同键列表的需求太常见了,给你整几个优雅的实现方案,按需pick~
方法一:用collections.defaultdict(直观易懂,新手友好)
这个方法逻辑最清晰,不用纠结键是否存在的问题,defaultdict会自动为新键创建空列表:
from collections import defaultdict # 你的输入字典列表 dict_list = [ {'x': ['a', 'b'], 'y': ['c', 'd']}, {'x': ['e', 'f'], 'y': ['g', 'h']} ] merged = defaultdict(list) for d in dict_list: for key, values in d.items(): merged[key].extend(values) # 可选:如果需要转成普通字典(不是必须的,defaultdict本身也能用) merged_dict = dict(merged) print(merged_dict) # 输出: {'x': ['a', 'b', 'e', 'f'], 'y': ['c', 'd', 'g', 'h']}
这种方式的好处是可读性拉满,后续维护代码的人一眼就能看懂逻辑,适合团队协作或者需要清晰代码的场景。
方法二:字典推导式+itertools.chain(简洁紧凑,一行搞定)
如果你喜欢简洁的代码,且题目已经保证所有字典键相同,那这个方法绝对适合你:
from itertools import chain dict_list = [ {'x': ['a', 'b'], 'y': ['c', 'd']}, {'x': ['e', 'f'], 'y': ['g', 'h']} ] merged_dict = { key: list(chain.from_iterable(d[key] for d in dict_list)) for key in dict_list[0] } print(merged_dict) # 输出: {'x': ['a', 'b', 'e', 'f'], 'y': ['c', 'd', 'g', 'h']}
chain.from_iterable会把所有同键的列表扁平化成一个迭代器,再转成列表,代码非常紧凑,适合熟悉Python高级特性的同学用。
方法三:functools.reduce(函数式编程风格)
如果你偏爱函数式编程的写法,用reduce来逐步合并字典也很优雅:
from functools import reduce def merge_two_dicts(a, b): # 因为所有字典键相同,直接遍历a的键就行 for key in a: a[key].extend(b[key]) return a dict_list = [ {'x': ['a', 'b'], 'y': ['c', 'd']}, {'x': ['e', 'f'], 'y': ['g', 'h']} ] merged_dict = reduce(merge_two_dicts, dict_list) print(merged_dict) # 输出: {'x': ['a', 'b', 'e', 'f'], 'y': ['c', 'd', 'g', 'h']}
reduce会把字典列表里的元素逐个传入合并函数,一步步把所有字典合并成一个,很符合函数式编程的思路。
内容的提问来源于stack exchange,提问作者goedwig
相关产品推荐
相关产品推荐

