Добавить вложенные словари на соответствующие ключи - PullRequest
3 голосов
/ 10 марта 2020

У меня есть вложенный словарь, такой как:

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

4 голосов
/ 10 марта 2020

Одним из способов является использование 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])
0 голосов
/ 10 марта 2020

вы можете использовать список со следующим: 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()))]

output:

[3.0, 5.0]

это будет работать, если ваша версия python>> 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]
...