2016-04-12 174 views
2

我知道這很簡單,但我一直在搜索大約一個小時,無法找到一個好答案。我知道必須有比通過遍歷鍵來尋找匹配然後添加值更優雅的東西。添加具有相同密鑰的值

我所擁有的是:

test_dict = [{'Bob':2}, {'Jane':1}, {'Marco':1}, {'Suzy':2}, {'Bob':1},{'Mark':3}, {'Ellen':1}, {'Suzy':1}] 

我想要做的就是添加值在一起的時候按鍵匹配(在這種情況下,Bob和蘇茜)。這將通過將它們的值一起添加來消除重複的鍵。它看起來像:

test_dict = [{'Bob':3}, {'Jane':1}, {'Marco':1}, {'Suzy':3},{'Mark':3}, {'Ellen':1}] 

我曾嘗試是:

from collections import Counter 
final = Counter(test_dict) 

以及其他藏品模塊項目。我真的不想遍歷字典來比較每個關鍵字,然後將這些值加在一起。這似乎是一個非常低效的想法,但我想不出(或找到)其他任何東西。

回答

2

你在正確的軌道上Counter

>>> sum((Counter(d) for d in test_dict), Counter()) 
Counter({'Bob': 3, 'Ellen': 1, 'Jane': 1, 'Marco': 1, 'Mark': 3, 'Suzy': 3}) 

爲了做同樣的一個顯式循環會是這樣:

>>> counter = Counter() 
>>> for dict_ in test_dict: 
...  counter.update(**dict_) 
...  
>>> counter 
Counter({'Bob': 3, 'Ellen': 1, 'Jane': 1, 'Marco': 1, 'Mark': 3, 'Suzy': 3}) 
1

您還可以使用defaultdict,在那裏你提取每個關鍵並將其值添加到defaultdict中,該值用於實例化尚不存在的鍵。

from collections import defaultdict 

dd = defaultdict(int) 
for d in test_dict: 
    dd[d.keys()[0]] += d.values()[0] 

>>> dd 
defaultdict(int, 
      {'Bob': 3, 
      'Ellen': 1, 
      'Jane': 1, 
      'Marco': 1, 
      'Mark': 3, 
      'Suzy': 3}) 
相關問題