如何在字典中汇总唯一键?

时间:2017-03-18 15:31:39

标签: python dictionary sum

我在列表中有一堆键值:

all = [('a' : '87'), ('b': '72'), ('a' : '39'), ('b' : '84')]

如何快速总结具有相同键的所有值?

输出:

a = 126
b = 156

2 个答案:

答案 0 :(得分:2)

字典中不能有重复的键。以后匹配的密钥会覆盖之前的密钥。另外dict是一个非常糟糕的名称,因为它隐藏了dict类类型:

>>> D = {'a' : '87', 'b': '72', 'a' : '39', 'b' : '84'}
>>> D
{'b': '84', 'a': '39'}

如果您将数据成对存储在列表中,则:

>>> L=[('a','87'), ('b', '72'), ('a','39'), ('b','84')]
>>> L
[('a', '87'), ('b', '72'), ('a', '39'), ('b', '84')]

defaultdict为不存在的密钥创建其默认类型,因此如果密钥尚不存在,则下面的D[k]将为零:

>>> from collections import defaultdict
>>> D = defaultdict(int)
>>> for k,v in L:
...   D[k] += int(v)
...
>>> D
defaultdict(<class 'int'>, {'b': 156, 'a': 126})
>>> dict(D)
{'b': 156, 'a': 126}

答案 1 :(得分:0)

首先,在Python中,据我所知,没有数据类型表示:

[('a' : '87'), ('b': '72'), ('a' : '39'), ('b' : '84')]

可能你指的是一个dict,顺便说一下,你不能使用重复的密钥。

这个答案与@Mark Tolonen的答案非常相似,只是在没有模块的情况下只使用原始数据类型:

>>> a = [('a','87'), ('b','72'), ('a','39'), ('b','84')]
>>> d = {}
>>> 
>>> for k,v in a:
        #if k already exists in d, just add up the values
        if k in d:
            d[k] += int(v)
        #otherwise, create a (k,int(v)) pair in the dict
        else:
            d[k] = int(v)


>>> d
{'a': 126, 'b': 156}