12

什么是一个好的 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]
4

2 回答 2

22
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 视图来实现相同的效果,而无需转换为集合:

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())
于 2013-02-18T16:44:21.710 回答
4

非破坏性:

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)
于 2013-02-18T16:44:47.217 回答