如何将具有键作为元组的python字典中的值相加

时间:2015-10-21 07:07:32

标签: python dictionary

我有以下字典,其中键为元组

D_grpTagReport = { ('Tag1', '1'):345.56 ,
                   ('Tag1', '2'):45.6 ,
                   ('Tag2', '3'):3.1 ,
                   ('Tag3', '1'):21.56 ,
                   ('Tag2', '3'):1.56 ,
                 }

我想获得每个唯一标记的值的总和。是否有可用于处理此词典的内置实用程序。

结果示例:

Tag1 : 391.16     # (total of all Tag1)
Tag2 : 4.66       # (total of all Tag2) 
Tag3 : 21.56      # (total of all Tag3) 

3 个答案:

答案 0 :(得分:2)

您可以使用defaultdict

>>> from collections import defaultdict
>>> D_grpTagReport = { ('Tag1', '1'):345.56 ,
...                    ('Tag1', '2'):45.6 ,
...                    ('Tag2', '3'):3.1 ,
...                    ('Tag3', '1'):21.56 ,
...                    ('Tag2', '3'):1.56 ,
...                  }
>>> result = defaultdict(int)
>>> for t in D_grpTagReport:
...     result[t[0]] += D_grpTagReport[t]
...
>>> result
defaultdict(<class 'int'>, {'Tag3': 21.56, 'Tag1': 391.16, 'Tag2': 1.56})

答案 1 :(得分:2)

已有一些好的答案,但这是一种不同的(更简单的IMO)方法。

d = {('A', '1'): 2, ('A', '2'): 5, ('B', '1'): 1}
keys={k[0]:0 for k in d.keys()}
for key in d:
    keys[key[0]] = keys[key[0]] + d[key]
print(keys)  # {'A': 7, 'B': 1}

再次使用OP的数据:

d = { ('Tag1', '1'):345.56 ,
      ('Tag1', '2'):45.6 ,
      ('Tag2', '3'):3.1 ,
      ('Tag3', '1'):21.56 ,
      ('Tag2', '3'):1.56 ,
    }
keys={k[0]:0 for k in d.keys()}
for key in d:
    keys[key[0]] = keys[key[0]] + d[key]
print(keys)  # {'Tag1': 391.16, 'Tag2': 1.56, 'Tag3': 21.56}

答案 2 :(得分:1)

您可以使用itertools.groupby,首先获取字典的.items(),然后根据密钥的第一个元素对其进行排序,并使用{itertools.groupby对其进行排序1}}作为键的第一个元素(key元组的第一个元素的第一个元素)。然后,对于每个组,您可以对值进行key,value以获得所需内容。示例 -

sum()

请注意您的结果有点不对,您的字典也是如此,因为from itertools import groupby for key,group in groupby(sorted(D_grpTagReport.items()),key=lambda x:x[0][0]): total = sum(g[1] for g in group) print(key,':',total) 不能使用具有多个值的相同密钥。

演示 -

dictionary