10

从 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

3 回答 3

16

你可以使用类似的东西:

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'}
于 2013-03-07T17:07:44.307 回答
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())

在 python 2.7 或 3 中使用future包:

from future.utils import viewkeys
old.update((k, new[k]) for k in viewkeys(old) & viewkeys(new))

或者在 python 2 或 3 中future通过创建新集合而不使用包:

old.update((k, new[k]) for k in set(old.keys()) & set(new.keys()))
于 2017-11-29T17:12:07.817 回答
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'}
于 2021-02-13T23:22:28.927 回答