如何合并两个Python字典并保留同键下的所有值?
合并嵌套字典:保留相同外层键下的所有内层键值对
嘿,我完全懂你的困扰——dict.update()方法会直接用新字典的整个值替换旧字典对应键的值,而你想要的是把相同外层键下的内层字典也合并起来,保留所有键值对对吧?
先把你给出的字典补全(末尾缺了闭合大括号),方便后续演示:
dict1 = { 160: {'na': 'na'}, 162: {'test_': 'qq', 'wds': 'wew'}, 163: {'test_env': 'test_env_value', 'env': 'e'}, 159: {'no': 'test_no'} } dict2 = { 160: {'naa': 'na'}, 162: {'envi_specs': 'qq', 'wds': 'wew'}, 163: {'test_env': 'test_env_value', 'ens': 's'} }
下面给你两种简单可行的解决方案:
方法一:遍历所有键并合并内层字典
这种方法会处理两个字典里的所有键(包括只在其中一个字典里存在的键),然后把对应内层字典合并:
merged_dict = {} # 获取两个字典所有键的并集,确保不遗漏任何键 all_keys = set(dict1.keys()).union(dict2.keys()) for key in all_keys: # 取出对应内层字典,没有的话用空字典兜底 inner_dict1 = dict1.get(key, {}) inner_dict2 = dict2.get(key, {}) # 合并内层字典:如果有重复键,dict2的内层值会覆盖dict1的(和你期望的结果一致) merged_inner = {**inner_dict1, **inner_dict2} merged_dict[key] = merged_inner
运行后得到的结果就是你想要的:
{ 159: {'no': 'test_no'}, 160: {'na': 'na', 'naa': 'na'}, 162: {'test_': 'qq', 'wds': 'wew', 'envi_specs': 'qq'}, 163: {'test_env': 'test_env_value', 'env': 'e', 'ens': 's'} }
方法二:基于原字典扩展(更节省内存)
如果你想以dict1为基础,直接扩展它(或者复制一份避免修改原字典),可以这样做:
# 先复制dict1,避免修改原字典 merged_dict = dict1.copy() for key, inner_dict in dict2.items(): if key in merged_dict: # 对已存在的键,更新内层字典而不是替换整个值 merged_dict[key].update(inner_dict) else: # 对不存在的键,直接添加整个内层字典 merged_dict[key] = inner_dict.copy()
这个方法的结果和上面完全一致,而且不需要额外处理所有键的并集,效率更高一些。
小提示
如果遇到内层字典有重复键,你可以通过调整合并顺序来决定哪个值保留:
{**inner_dict1, **inner_dict2}:dict2的内层值覆盖dict1的{**inner_dict2, **inner_dict1}:dict1的内层值覆盖dict2的
这样就能完美满足你合并嵌套字典并保留所有值的需求啦!
内容的提问来源于stack exchange,提问作者JustCurious
相关产品推荐
相关产品推荐

