添加具有相同密钥的值

时间:2016-04-12 02:53:09

标签: python python-3.x dictionary

我知道这很简单,但我一直在搜索大约一个小时,但却无法找到一个好的答案。我知道必须有更优雅的东西,而不是遍历键来寻找匹配然后添加值。

我拥有的是:

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)

以及其他收藏模块项目。我真的不想循环遍历字典来比较匹配的每个键,然后将这些值加在一起。这似乎是一个非常低效的想法,但我无法想到(或找到)其他任何东西。

2 个答案:

答案 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})