添加具有相同键的值

2024-10-06 11:26:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我知道这很简单,但我已经搜索了大约一个小时,找不到一个好的答案。我知道一定有比遍历键寻找匹配项然后添加值更优雅的方法。你知道吗

我得到的是:

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)

以及其他集合模块项。我真的不希望遍历字典来比较每个键的匹配,然后将值加在一起。这似乎是一个非常低效的想法,但我想不出(或找不到)其他任何东西。你知道吗


Tags: 方法答案fromtestcountercollectionsdictbob
2条回答

您还可以使用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})

您使用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})

相关问题 更多 >