[英]how to sum values from a python dictionary having key as tuple
我有以下字典與鍵作為元組
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)
你可以使用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})
已有一些好的答案,但這里有一個不同的(更簡單的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}
你可以使用itertools.groupby
,首先取字典的.items()
,然后根據鍵的第一個元素對該列表進行排序,並使用itertools.groupby
, key
作為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
不能有多個值的相同鍵。
演示 -
>>> D_grpTagReport = { ('Tag1', '1'):345.56 ,
... ('Tag1', '2'):45.6 ,
... ('Tag2', '3'):3.1 ,
... ('Tag3', '1'):21.56 ,
... ('Tag2', '3'):1.56 ,
... }
>>>
>>>
>>> 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)
...
Tag1 : 391.16
Tag2 : 1.56
Tag3 : 21.56
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.