什么是良好的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]
我想这可行,但使用“受保护”功能:
[dict1.__setitem__(k, dict2[k]) for k in dict1 if k in dict2]
答案 0 :(得分:10)
dict1.update((k, dict2[k]) for k in set(dict2).intersection(dict1))
是我在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'}
在python 2.7中,您可以使用新的Dict views来实现相同的功能,而无需转换为集合:
dict1.update((k, dict2[k]) for k in dict1.viewkeys() & dict2.viewkeys())
在Python 3中,dict视图是默认视图,因此您可以将其拼写为:
dict1.update((k, dict2[k]) for k in dict1.keys() & dict2.keys())
答案 1 :(得分:0)
非破坏性地:
dict((k, dict2.get(k, v)) for k, v in dict1.items())
修改dict1
:
dict1.update((k, v) for k, v in dict2.items() if k in dict1)