用另一个字典更新字典,但仅更新非空值
根据Python的文档,我发现dict
有一个update(...)
方法,但这个方法似乎没有处理一些特殊情况,比如我不想用新值更新旧字典的情况。例如,当新值是None
的时候。
这是我现在的做法:
for key in new_dict.keys():
new_value = new_dict.get(key)
if new_value: old_dict[key] = new_value
有没有更好的方法来用新字典更新旧字典呢?
4 个回答
0
在 Python 3.x 中,如果你想遍历字典里的键和值,可以使用 for k,v in new.items()
这个写法。
IN:
old = {1: 'one', 2: 'two'}
new = {1: 'new_one', 2: None, 3: 'new_three'}
old.update((k,v) for k,v in new.items() if v is not None)
Out:
old = {1: 'new_one', 2: 'two'}
1
更新:我觉得我之前可能在回答一个错误的问题(见我下面的评论),因为这显然没有回答所提的问题。不过如果这里有一些有用的信息,我还是决定把它留着(除非有人明确表示最好删除它)。
在Python 3中:
old.update((k, new[k]) for k in old.keys() & new.keys())
在Python 2.7中:
old.update((k, new[k]) for k in old.viewkeys() & new.viewkeys())
在使用future
包的Python 2.7或3中:
from future.utils import viewkeys
old.update((k, new[k]) for k in viewkeys(old) & viewkeys(new))
或者在没有使用future
包的情况下,通过创建新的集合在Python 2或3中:
old.update((k, new[k]) for k in set(old.keys()) & set(new.keys()))
19
你可以使用类似这样的东西:
old = {1: 'one', 2: 'two'}
new = {1: 'newone', 2: None, 3: 'new'}
old.update( (k,v) for k,v in new.items() if v is not None)
# {1: 'newone', 2: 'two', 3: 'new'}