2013-04-23 114 views
0

我有一個元素列表,其中每個元素是一種字典。我希望這個實現在Python中完成。在包含字典和返回字典的列表上操作

我的輸入是這樣的:

MyList = [{'Kathy':1, 'Bob':1, 'Spencer':1}, {'Kathy':4, 'Cynthia':2, 'Bob':3, 'Goldman':1}, {'Spencer':2, 'Bob':1}] 

我的輸出應該是這樣的:

MyDict = {'Kathy':5, 'Bob':5, 'Spencer':3, 'Cynthia':2, 'Goldman':1} 
+1

可能的重複[是否有任何pythonic的方式來結合兩個字典(添加鍵出現在兩個值)?](http://stackoverflow.com/questions/11011756/is-there-any-pythonic-way -to-combine-two-dicts-adding-values-for-keys-that-appe) – 2013-04-23 19:50:05

回答

2

使用Counter

>>> from collections import Counter 
>>> myList = [{'Kathy':1, 'Bob':1, 'Spencer':1}, {'Kathy':4, 'Cynthia':2, 'Bob':3, 'Goldman':1}, {'Spencer':2, 'Bob':1}] 
>>> myDict = Counter() 
>>> for d in myList: 
     myDict.update(d) 
>>> myDict 
Counter({'Kathy': 5, 'Bob': 5, 'Spencer': 3, 'Cynthia': 2, 'Goldman': 1}) 
0

下面是使用defaultdict做到這一點的一種方式。

import collections 

MyDict = collections.defaultdict(int) 
for d in MyList: 
    for k,v in d.items(): 
     MyDict[k] += v 
MyDict = dict(MyDict) #if you want a normal dict 

編輯:看起來像櫃檯版本更好。但是,如果您必須執行除添加整數之外的其他操作,那麼瞭解defaultdicts仍然很重要。例如,它們可用於累積列表或集合。

-1

這裏是這樣做的另一種方式,似乎什麼我一點比迄今所提供的方案更Python(但它更可能使用更多的內存,因爲它不是基於發電機):

my_dict = {key: 0 
      for one_dict in list_of_dicts 
      for key in one_dict.keys()} 
my_dict = {key: one_dict[key]+my_dict[key] 
      for one_dict in list_of_dicts 
      for key in one_dict.keys()} 

編輯:謝謝@ ShadowRanger的洞察力,然而,在這種情況下,我寧願使用.keys()選項來專門恢復密鑰,而不是簡單地遍歷字典中的每個密鑰對,因爲密鑰會需要將這樣的密鑰添加到最終字典中。

+0

你的理解是倒退的;你需要首先對'list_of_dicts'進行迭代,所以你有一個'one_dict'來重複第二個。此外,這不會總結任何值,只保留最後一個值,並且在Python 2中使用'.keys()'是浪費的,而沒有獲得任何東西(它會產生鍵的中間列表副本,直接迭代'dict'而不需要中間''list')。 – ShadowRanger 2016-01-28 13:26:29