Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用其他词典更新词典,但仅更新非None值_Python - Fatal编程技术网

Python 使用其他词典更新词典,但仅更新非None值

Python 使用其他词典更新词典,但仅更新非None值,python,Python,从python中我看到,dict有一个update(…)方法,但它似乎不接受我可能不想用新值更新旧字典的异常。例如,当值为None时 这就是我目前所做的: for key in new_dict.keys(): new_value = new_dict.get(key) if new_value: old_dict[key] = new_value 是否有更好的方法使用新词典更新旧词典。您可以使用以下方法: old = {1: 'one', 2: 'two'} new = {1: 'n

从python中我看到,
dict
有一个
update(…)
方法,但它似乎不接受我可能不想用新值更新旧字典的异常。例如,当值为
None

这就是我目前所做的:

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

是否有更好的方法使用新词典更新旧词典。

您可以使用以下方法:

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

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

基于但按建议使用:

在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中,使用包:

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

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

对于Python3.x,要在整个字典中迭代键值,请在new.items()中对k、v使用


您的代码还将丢弃
False
0
。您还可以在new dict.items()中使用
对k,v进行迭代:
实际上,这看起来不错,但是
update()
已经只更新
new
中存在的键。但是,它没有回答值为
None
并跳过这些键的问题。@SunnyPatel你说得对!事实上,现在我再看一遍,我发现我的解决方案也无法更新
old
中不存在的键的值。事实上,我想我一定是在试图回答一个错误的问题:“我如何(有效地)只更新
old
中已经存在的键的值?”对于这个问题,中的计时显示了交集如何实际有助于性能,即使对正确性来说是不必要的。(谢谢!)
old.update((k, new[k]) for k in set(old.keys()) & set(new.keys()))
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'}