2013-02-18 58 views
1

什么是好的1班轮(不是将它变成功能等)来实现这一目标:更新字典,无需添加新的密钥?

# 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

这在我看来是低效的,但你可以去'[dict1.update({K:dict2 [K]})...',而不是使用'__setitem__ '。 – zigg 2013-02-18 16:55:16

+0

'__setitem __()'不是'受保护的',因为它是一个内部的API钩子实现。您通常会直接使用该API,调用'dict1 [k] = dict2 [k]'或者使用'operator.setitem(dict1,k,dict2 [k])'代替。这里没有必要,但是这是你用来直接调用'__setitem __()'的方法。 – 2013-02-18 16:59:16

回答

9
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,字典视图是默认的,所以可以替代拼写为:

dict1.update((k, dict2[k]) for k in dict1.keys() & dict2.keys()) 
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)