用另一个字典更新字典,但仅更新非空值

13 投票
4 回答
10086 浏览
提问于 2025-04-17 18:17

根据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

更新:我觉得我之前可能在回答一个错误的问题(见我下面的评论),因为这显然没有回答所提的问题。不过如果这里有一些有用的信息,我还是决定把它留着(除非有人明确表示最好删除它)。

基于Jon的回答,但使用集合交集,正如这里所建议的:

在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'}

撰写回答