【问题标题】:Update a dictionary with another dictionary, but only non-None values用另一个字典更新一个字典,但只更新非无值
【发布时间】:2013-02-23 00:17:54
【问题描述】:

从 python documentation 我看到 dict 有一个 update(...) 方法,但它似乎没有例外,我可能不想用新值更新旧字典。例如,当值为None

这是我目前所做的:

for key in new_dict.keys():
  new_value = new_dict.get(key)
  if new_value: old_dict[key] = new_value

有没有更好的方法来使用新字典更新旧字典。

【问题讨论】:

  • 您的代码还会丢弃False0。您也可以使用for k,v in new_dict.items(): 进行迭代

标签: python


【解决方案1】:

你可以使用类似的东西:

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

【讨论】:

    【解决方案2】:

    更新:我想我在这里试图回答错误的问题(请参阅下面的评论),因为这显然不能回答所提出的问题。万一有什么有用的东西,我还是把它留在这里(除非有人明确表示最好删除它)。

    Jon's answer 为基础,但按照here 的建议使用set intersection

    在 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))
    

    或者在没有 future 包的 python 2 或 3 中通过创建新集合:

    old.update((k, new[k]) for k in set(old.keys()) & set(new.keys()))
    

    【讨论】:

    • 实际上这看起来不错,但update() 已经只更新了new 中存在的键。但是,它没有回答值是 None 并跳过这些键的问题。
    • @SunnyPatel 你是对的!事实上,现在我再看一遍,我发现我的解决方案也无法更新 old 中不存在的键的值。事实上,我想我一定一直在尝试回答错误的问题:“我如何(有效地)只更新 old 中已经存在的键的值?”对于那个问题,this solution 中的时间安排显示了交叉点实际上如何有助于提高性能,即使对于正确性来说是不必要的。 (谢谢!)
    【解决方案3】:

    要让 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'}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-24
      • 1970-01-01
      • 2019-03-14
      • 1970-01-01
      • 2020-12-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多