2012-03-09 76 views
5

的一部分的字典,我經常用這個結構發現自己:用dict2一個子集更新dict1更新與另一個字典

dict1['key1'] = dict2['key1'] 
dict1['key2'] = dict2['key2'] 
dict1['key3'] = dict2['key3'] 

類。

我覺得沒有在形式

​​

什麼方法,你通常需要做同樣的事情內置的方法?你有沒有爲此做出自己的功能?它看起來像什麼?

評論?


我已經提交了idea Python的思路:

有時候你想要的字典這是另一個字典的子集。這將很好,如果 dict.items接受一個可選的密鑰列表返回。如果沒有鍵 給出 - 使用默認行爲 - 獲取所有項目。

class NewDict(dict): 

    def items(self, keys=()): 
     """Another version of dict.items() which accepts specific keys to use.""" 
     for key in keys or self.keys(): 
      yield key, self[key] 


a = NewDict({ 
    1: 'one', 
    2: 'two', 
    3: 'three', 
    4: 'four', 
    5: 'five' 
}) 

print(dict(a.items())) 
print(dict(a.items((1, 3, 5)))) 

[email protected]:~/Desktop$ python test.py 
{1: 'one', 2: 'two', 3: 'three', 4: 'four', 5: 'five'} 
{1: 'one', 3: 'three', 5: 'five'} 

所以更新與另一個字典的一部分的字典,你可以使用:

dict1.update(dict2.items(['key1', 'key2', 'key3'])) 

回答

5

沒有內置的功能,我知道的,但是這將是一個簡單的2襯墊:

for key in ('key1', 'key2', 'key3'): 
    dict1 = dict2[key] 
+0

我學到了什麼新東西 - 真的沒有任何捷徑......我喜歡這個答案 - 它更加明確。我認爲它比aquavitae的答案快,因爲它不會創建任何中間列表或生成器。 – warvariuc 2012-03-09 12:56:50

7

你可以做這樣的:

keys = ['key1', 'key2', 'key3'] 
dict1.update((k, dict2[k]) for k in keys) 
+0

我認爲它應該是dict1.update({k:dict2 [k] for k in keys})(你用字典更新,而不是用列表更新) – 2012-03-09 09:11:11

+0

@GuyAdini在2.7中,你的作品也是如此。但在舊版本中,這還不存在。 aquavitae是絕對正確的。 – glglgl 2012-03-09 09:12:06

+0

我不好,你說得對。 – 2012-03-09 09:27:54

0
dict1.update([(key, dict2[key]) for key in dict2.keys()]) 
+0

這與'dict1.update(dict2)' – warvariuc 2012-03-09 12:52:36

+0

相同請解釋這是什麼,並使用四個縮進空格,以便您的代碼格式正確。 – agf 2012-04-14 00:59:21