更新dict而不添加新密钥?

时间:2013-02-18 16:42:09

标签: 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]

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

[dict1.__setitem__(k, dict2[k]) for k in dict1 if k in dict2]

2 个答案:

答案 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)