在匹配键上添加嵌套字典

时间:2020-03-10 16:53:38

标签: python dictionary

我有一个嵌套的字典,例如:

{'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

我该怎么做?我已经尝试了,但是却造成了大麻烦

2 个答案:

答案 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]

如果您的python version is >= 3.6

另外,您可以使用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]