以1字典为基础合并Python中的字典
这个问题在这里已经有了答案:
“Pythonicness”是一个难以评估的措施,但这是我的承诺:
def merge_dicts(base_dict, other_dict):
""" Merge two dicts
Ensure that the base_dict remains as is and overwrite info from other_dict
"""
if other_dict is None:
return base_dict
t = type(base_dict)
if type(other_dict) != t:
raise TypeError("Mismatching types: {} and {}."
.format(t, type(other_dict)))
if not issubclass(t, dict):
return other_dict
return {k: merge_dicts(v, other_dict.get(k)) for k, v in base_dict.items()}
例:
merge_dicts({"a":2, "b":{"b1": 5, "b2": 7}}, {"b": {"b1": 9}})
>>> {'a': 2, 'b': {'b1': 9, 'b2': 7}}
如果你使用python 3.5或更高版本,你可以简单地做:
merged_dict = {**base_dict, **other_dict}
如果您使用任何以前的版本,您可以使用update
方法执行此操作:
merged_dict = {}
merged_dict.update(base_dict)
merged_dict.update(other_dict)
有关它的更多信息,你可以检查Python的合并词典的习惯用法
您可以使用dict.update
方法和一个生成器表达式:
base_dict.update((k, v) for k, v in other_dict.items() if k in base_dict)
说明
base_dict.update(other_dict)
将覆盖值base_dict
与那些在other_dict
。 如果一个键存在于other_dict
但不在base_dict
,它将被添加到base_dict
,这不是你想要的。 因此,您需要测试other_dict
中的每个键是否在base_dict
。
dict.update
可以将可迭代作为第一个参数。 如果后者包含2元组(k, v)
,则base_dict[k]
将被设置为v
。
help(dict.update)
摘要help(dict.update)
:
buildins.dict实例的update(...)方法
如果E存在并且缺少.keys()方法,那么:对于E中的k,v:D [k] = v
因此,传递一个生成器表达式很方便。 如果您不熟悉生成器表达式,则括号内的内容大致相当于以下内容:
l = []
for k, v in other.dict_items():
if k in base_dict:
l.append((k, v))
然后l
传递给update
,如base_dict.update(l)
。