LINUX.ORG.RU

Поэлементное сложение списков с вложенными словарями

 ,


0

2

Есть 2 списка всегда из 5 элементов - словарей, значения которых тоже словарь например

x = [{'2': {'1': 7}, '3':{'1':0, '5': 0}}, {}, {}, {}, {}]
y = [{'2': {'1': 1, '2': 5}}, {}, {}, {}, {}]
в итоге нужно сложить поэлементно два этих списка Должно получиться
x + y =   [{'2': {'1': 8, '2': 5}, '3':{'1':0, '5': 0}}, {}, {}, {}, {}]
начал писать запутался в циклах, просьба помочь

В цикле по zip от этих двух списков:
объединяете ключи двух словарей через set
в цикле по полученному set достаёте get(k, 0) из каждого словаря значения, складывается и кладёте в результирующий словарь

AntonI ★★★★★
()
Последнее исправление: AntonI (всего исправлений: 1)

Как выше написали, надо взять set(x.keys()+y.keys()), пройти по нему, далее for k2 in set(x.get(k, {}).keys() + y.get(k, {}).keys()) и потом что-то типа res = x.get(k, {}).get(k2, 0) + y.get(k, {}).get(k2, 0)

Res = { k : { k2 : x.get(k, {}).get(k2, 0) + y.get(k, {}).get(k2, 0) for k2 in set(x.get(k, {}).keys() + y.get(k, {}).keys()) } for k in set(x.keys()+y.keys()) }
Sahas ★★★★☆
()
Последнее исправление: Sahas (всего исправлений: 6)

Как складывать поэлементно, если например:

x = [{2: {...}}, {3: {...}}, {}, {}, {12: {...}}]
y = [{2: {...}}, {4: {...}}, {}, {}, {}]

Если, скажете, что такого не может быть, тогда зачем вам списки, может быть они лишние?

vvn_black ★★★★★
()
Последнее исправление: vvn_black (всего исправлений: 2)
Ответ на: комментарий от vvn_black

Это как раз нормально. Значения отсутствующих элементов считаются равными нулю.

Разреженные матрицы так представляют обычно.

AntonI ★★★★★
()
Последнее исправление: AntonI (всего исправлений: 1)
#намеренно асимметрично и императивно 
x = [{'2': {'1': 7}, '3':{'1':0, '5': 0}}, {}, {}, {}, {}]
y = [{'2': {'1': 1, '2': 5}}, {}, {}, {}, {}]
from copy import deepcopy as dp 
def fusion(a,b):
    for k,v in b.items():
        if k in a:
            for p,q in b[k].items():a[k][p]=q+a[k].get(p,0)
        else:a[k]=v
    return a
def x_plus_y(x,y):return [fusion(dp(a),dp(b))for a,b in zip(x,y)]
print(x_plus_y(x,y))
qulinxao3 ★☆
()
def addict(a, b):
    c = { k : (a|b)[k] for k in a.keys() ^ b.keys() }
    for k in a.keys() & b.keys():
        both_are_dicts = type(a[k]) == type(b[k]) == dict
        c[k] = addict(a[k], b[k]) if both_are_dicts else a[k] + b[k]
    return c
anonymous
()