我正在寻找有关我的Python代码的反馈。我想合并两个词典。其中一个字典控制结构和默认值,第二个字典将在适用时覆盖默认值。
请注意,我正在寻找以下行为:
我写了这个简单的函数:
def merge_dicts(base_dict, other_dict):
""" Merge two dicts
Ensure that the base_dict remains as is and overwrite info from other_dict
"""
out_dict = dict()
for key, value in base_dict.items():
if key not in other_dict:
# simply use the base
nvalue = value
elif isinstance(other_dict[key], type(value)):
if isinstance(value, type({})):
# a new dict myst be recursively merged
nvalue = merge_dicts(value, other_dict[key])
else:
# use the others' value
nvalue = other_dict[key]
else:
# error due to difference of type
raise TypeError('The type of key {} should be {} (currently is {})'.format(
key,
type(value),
type(other_dict[key]))
)
out_dict[key] = nvalue
return out_dict
我相信这可以做得更漂亮/ pythonic。
答案 0 :(得分:1)
如果您使用的是python 3.5或更高版本,则可以执行以下操作:
$("#myForm").submit(function(e){
e.preventDefault();
$.ajax({
url:'/admin/projects/postUpload',
type:'post',
data:$('#myForm').serializeArray(),
success: function(){
$("#form1").fadeOut(1000);
$("#form2").fadeIn(1000);
}
});
});
如果您使用的是任何先前版本,则可以使用merged_dict = {**base_dict, **other_dict}
方法执行此操作:
update
有关它的更多信息,您可以查看The Idiomatic Way to Merge Dictionaries in Python
答案 1 :(得分:1)
“Pythonicness”是一个很难评估的方法,但这是我的看法:
<artifactId>spark-testing-base_2.11</artifactId>
<artifactId>spark-core_2.10</artifactId>
示例:
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()}
答案 2 :(得分:0)
您可以使用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
可以将iterable作为第一个参数。如果后者包含2个元组(k, v)
,那么base_dict[k]
将设置为v
。
摘自help(dict.update)
:
builtins.dict实例的更新(...)方法
如果E存在且缺少.keys()方法,那么:对于k,v在E中: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)
。