我知道这很简单,但我一直在搜索大约一个小时,但却无法找到一个好的答案。我知道必须有更优雅的东西,而不是遍历键来寻找匹配然后添加值。
我拥有的是:
test_dict = [{'Bob':2}, {'Jane':1}, {'Marco':1}, {'Suzy':2}, {'Bob':1},{'Mark':3}, {'Ellen':1}, {'Suzy':1}]
我想要做的是在键匹配时将值加在一起(在本例中为Bob和Suzy)。这将通过将重复键添加到一起来消除重复键。它看起来像是:
test_dict = [{'Bob':3}, {'Jane':1}, {'Marco':1}, {'Suzy':3},{'Mark':3}, {'Ellen':1}]
我试过的是:
from collections import Counter
final = Counter(test_dict)
以及其他收藏模块项目。我真的不想循环遍历字典来比较匹配的每个键,然后将这些值加在一起。这似乎是一个非常低效的想法,但我无法想到(或找到)其他任何东西。
答案 0 :(得分: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 :(得分:1)
您还可以使用defaultdict
,在其中提取每个键和值test_dict
并将其添加到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})