更新dict而不添加新密钥?

Dav*_*ave 4 python dictionary

什么是良好的1-liner(除了将其置于函数中)以实现此目的:

# like dict1.update(dict2) but does not add any keys from dict2
# that are not already in dict1
for k in dict1:
    if k in dict2:
        dict1[k]=dict2[k]
Run Code Online (Sandbox Code Playgroud)

我想这可行,但使用"受保护"功能:

[dict1.__setitem__(k, dict2[k]) for k in dict1 if k in dict2]
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 12

dict1.update((k, dict2[k]) for k in set(dict2).intersection(dict1))
Run Code Online (Sandbox Code Playgroud)

我是如何在Python 2.6或更低版本中执行此操作(请参阅后续版本中有关如何执行此操作的详细信息).

在另一个映射旁边,dict.update()也可以采用可迭代的(key, value)元组,我们根据两个字典的集合交集生成它们(因此它们共有的所有键).

演示:

>>> dict1 = {'foo':'bar', 'ham': 'eggs'}
>>> dict2 = {'ham': 'spam', 'bar': 'baz'}
>>> dict1.update((k, dict2[k]) for k in set(dict2).intersection(dict1))
>>> dict1
{'foo': 'bar', 'ham': 'spam'}
Run Code Online (Sandbox Code Playgroud)

在python 2.7中,您可以使用新的Dict视图来实现相同的功能,而无需转换为集合:

dict1.update((k, dict2[k]) for k in dict1.viewkeys() & dict2.viewkeys())
Run Code Online (Sandbox Code Playgroud)

在Python 3中,dict视图是默认视图,因此您可以将其拼写为:

dict1.update((k, dict2[k]) for k in dict1.keys() & dict2.keys())
Run Code Online (Sandbox Code Playgroud)