我有一个嵌套的字典,例如:
{'A1': {'T1': [1, 3.0, 3, 4.0], 'T2': [2, 2.0]}, 'A2': {'T1': [1, 0.0, 3, 5.0], 'T2': [2, 3.0]}}
我想要做的是对每个子词典求和,以获得:
A1 A2 A1 A2
T1+T1 T2+T2 (ignore the first entry of the list)
[3.0, 5.0, 9.0] <<<< output
1 2 3
res 3.0 + 0.0 = 3.0 and 2.0 + 3.0 = 5.0 and 5.0 + 4.0 = 9.0
我该怎么做?我已经尝试了,但是却造成了大麻烦
答案 0 :(得分:4)
一种方法是在列表理解中使用collections.Counter
,并在生成的sum
对象中使用Counter
:
from collections import Counter
d = {'A1': {'T1': 3.0, 'T2': 2.0}, 'A2': {'T1': 0.0, 'T2': 3.0}}
l = (Counter(i) for i in d.values())
sum(l, Counter())
# Counter({'T1': 3.0, 'T2': 5.0})
为了使sum
在这里工作,我已经将一个空Counter()
定义为start
参数,因此sum
需要其他Counter
对象。
要仅获取值,可以执行以下操作:
sum(l, Counter()).values()
# dict_values([3.0, 5.0])
答案 1 :(得分:0)
您可以对zip
使用列表推导:
d = {'A1': {'T1': 3.0, 'T2': 2.0}, 'A2': {'T1': 0.0, 'T2': 3.0}}
[sum(e) for e in zip(*(e.values() for e in d.values()))]
输出:
[3.0, 5.0]
另外,您可以使用2个for
循环:
r = {}
for dv in d.values():
for k, v in dv.items():
r.setdefault(k, []).append(v)
result = [sum(v) for v in r.values()]
print(result)
输出:
[3.0, 5.0]
编辑后
您可以使用:
from itertools import zip_longest
sum_t1, sum_t2 = list(list(map(sum, zip(*t))) for t in zip(*[e.values() for e in d.values()]))
[i for t in zip_longest(sum_t1[1:], sum_t2[1:]) for i in t if i is not None]
输出:
[3.0, 5.0, 6, 9.0]