Как добавить сумму ключей каждого словаря к другому ключу?

#python #json #list #dictionary #sum

Вопрос:

У меня есть формат json, как показано ниже:-

 l = {'itc': 'ball','classes': [{'scores': [{'len': 89,'width':50},{'len': 27,'width': 17}]},
             {'scores': [{'len': 90,'width': 44},{'len': 0,'width': 0}]},
             {'scores': [{'len': 50,'width': 26},{'len': 0,'width': 0}]}]}
 

Теперь я хочу создать новый список словарей. как показано ниже:-

 output= [{'result': [{'len': 89, 'width': 50}, {'len': 27, 'width': 17}], 'total': 116}, {'result': [{'len': 90, 'width': 44}, {'len': 0, 'width': 0}], 'total': 90}, {'result': [{'len': 50, 'width': 26}, {'len': 0, 'width': 0}], 'total': 50}]
 

Я смог разделить значения и смог разместить в требуемом формате, но я не могу добавить общий ключ оценки ‘len’ каждого словаря в к результату total каждого словаря. Он вычисляет целые значения всех словарей. Код и результат, которые я получил, выглядят следующим образом:-

 added=[]
output=[]
for k,v in l.items():
    if k=='classes':
        for i in v:
            for ke,ve in i.items():
                if ke=='scores':
                    for j in ve:
                        for key,val in j.items():
                            if key=='len':
                                add = val
                                added.append(add)
            sumed=sum(added)
            out={'result':ve,'total':sumed}
            output.append(out)
print(output)
 

Вывод, который я получил:-

 [{'result': [{'len': 89, 'width': 50}, {'len': 27, 'width': 17}], 'total': 116}, {'result': [{'len': 90, 'width': 44}, {'len': 0, 'width': 0}], 'total': 206}, {'result': [{'len': 50, 'width': 26}, {'len': 0, 'width': 0}], 'total': 256}]   
 

Как вы могли видеть, он суммирует все значения и добавляет их к ключу total . Как мне добавить сумму каждого словаря score к total ключу каждого словаря result , как показано ниже?

 output= [{'result': [{'len': 89, 'width': 50}, {'len': 27, 'width': 17}], 'total': 116}, {'result': [{'len': 90, 'width': 44}, {'len': 0, 'width': 0}], 'total': 90}, {'result': [{'len': 50, 'width': 26}, {'len': 0, 'width': 0}], 'total': 50}]
 

Комментарии:

1. @DaniMesejo сумма len(89 27 = 116)

Ответ №1:

Используйте sum , чтобы получить общее:

 res = [{"result" : cl["scores"], "total" :  sum(d["len"] for d in cl["scores"])} for cl in l["classes"]]
print(res)
 

Вывод

 [{'result': [{'len': 89, 'width': 50}, {'len': 27, 'width': 17}], 'total': 116}, {'result': [{'len': 90, 'width': 44}, {'len': 0, 'width': 0}], 'total': 90}, {'result': [{'len': 50, 'width': 26}, {'len': 0, 'width': 0}], 'total': 50}]
 

Или эквивалент, for-loop:

 res = []
for cl in l["classes"]:
    scores = cl["scores"]
    total = sum(d["len"] for d in cl["scores"])
    res.append({"result": scores, "total": total})