附加python词典,如果值为空则不替换

时间:2014-07-28 22:42:29

标签: python dictionary merge append overwrite

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的“状态”中的空值会覆盖“状态”键

提前致谢

2 个答案:

答案 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'}