dict1 = {"Country":"",
"State":"California"}
dict2 = {"Country":"United_states",
"State":""}
我需要将dict2
的值添加到dict1
,以便dict1
dict1
>>>{u"Country":"United_states",
u"State":"California"}
如果我只是dict1.update(dict2)
或类似的东西,它将会结束
dict1
>>>{u"Country":"United_states",
u"State":""}
由于dict2
的“状态”中的空值会覆盖“状态”键
提前致谢
答案 0 :(得分:3)
最简单的方法是使用dict理解来过滤掉空值:
dict1.update({k: v for k, v in dict2.items() if v})
如果您不理解其工作原理,可以将dict理解转换为显式循环:
filtered_dict2 = {}
for k, v in dict2.items():
if v:
filtered_dict2[k] = v
dict1.update(filtered_dict2)
如果你发现自己做了很多,你可能想写一个包装函数。例如,IIRC,Celery有一个这样的辅助函数:
def dictfilter(pred, d=None):
"""dictfilter(d) -- returns a dict with all non-empty values from d
dictfilter(pred, d) -- returns a dict with all values from d where pred(v)"""
if d is None:
return {k: v for k, v in pred.items() if v}
else:
return {k: v for k, v in d.items() if pred(v)}
(是的,那个接口,就像任何带有可选的第一个参数和强制性的最后一个参数的接口一样,很糟糕,但它的目的是与内置的filter
兼容,这可以追溯到Python 1.x并且为时已晚,无法改变......)
然后你可以这样做:
dict1.update(dictfilter(dict2))
答案 1 :(得分:2)
您可以filter
第二个字典,然后更新:
dict1 = {"Country":"", "State":"California"}
dict2 = {"Country":"United_states", "State":""}
dict1.update(filter(lambda x: x[1] is not '', dict2.items()))
print(dict1)
# {'Country': 'United_states', 'State': 'California'}