Нахождение суммы значений словарей во вложенном словаре в списке
надо найти сумму баллов за экзамены и доп. баллов extra_scores
candidates = [
{"name": "Vasya", "scores": {"math": 58, "russian_language": 62, "computer_science": 95}, "extra_scores":0},
{"name": "Fedya", "scores": {"math": 33, "russian_language": 85, "computer_science": 71}, "extra_scores":2},
{"name": "Petya", "scores": {"math": 92, "russian_language": 33, "computer_science": 82}, "extra_scores":1},
{"name": "Gosha", "scores": {"math": 48, "russian_language": 50, "computer_science": 68}, "extra_scores":0},
{"name": "Masha", "scores": {"math": 98, "russian_language": 48, "computer_science": 92}, "extra_scores":3},
]
Обратиться к этим элементам могу, но просуммировать не получается
print(candidates[0]['scores'])
Ответы (3 шт):
Я показал на примере Vasya, остальных сделаете сами
// Изменил на цикл, я надеюсь правильно понял, что вам нужно
candidates = [
{"name": "Vasya", "scores": {"math": 58, "russian_language": 62, "computer_science": 95}, "extra_scores":0},
{"name": "Fedya", "scores": {"math": 33, "russian_language": 85, "computer_science": 71}, "extra_scores":2},
{"name": "Petya", "scores": {"math": 92, "russian_language": 33, "computer_science": 82}, "extra_scores":1},
{"name": "Gosha", "scores": {"math": 48, "russian_language": 50, "computer_science": 68}, "extra_scores":0},
{"name": "Masha", "scores": {"math": 98, "russian_language": 48, "computer_science": 92}, "extra_scores":3},
]
total = candidates[0]["extra_scores"]
for i in candidates[0]["scores"]:
total += candidates[0]["scores"][i]
Я нашел решение путем создания доп. ключа sum в который и помещаю сумму баллов В функции sum_balls мы находим сумму баллов для одного студента
def sum_balls(student) :
return student['scores']['math'] + student['scores']['russian_language'] + student['scores']['computer_science'] + \
student['extra_scores']
Далее в функции main мы уже через enumerate через ключ получаем номер студента и в графу sum записываем результат выполнения программы sum_balls с параметром v что дает нам сумму баллов
def main(candidates) :
for k, v in enumerate(candidates) :
candidates[k]['sum'] = sum_balls(v)
candidates = sorted(candidates, key=lambda x : x['sum'], reverse=True)
for i in candidates :
print(i)
Осталось просто обозначить точку входа
if __name__ == '__main__' :
main(candidates)
Вы можете добавить сумму баллов для всякого студента прямо в его словарь, создав для этого новый ключ, например "sum_of_scores":
for candidate in candidates:
candidate["sum_of_scores"] = sum([candidate["scores"][subject]
for subject in candidate["scores"]])
Затем вы можете комфортно выводить имена кандидатов вместе с этими суммами:
for candidate in candidates:
print(f'{candidate["name"]}: {candidate["sum_of_scores"]:>3}')
Вывод:
Vasya: 215 Fedya: 189 Petya: 207 Gosha: 166 Masha: 238
Объяснения:
Я использовал так называемый генератор списка:
[candidate["scores"][subject] for subject in candidate["scores"]]который
- для каждого учебного предмета (
subject) - представленным ключем в словаре
candidate["scores"] - поместит в этот список значение этого ключа предмета
(т.е. баллы за этот предмет) -candidate["scores"][subject]
Например, для кандидата "Vassya" получим тем список
[58, 62, 95]- для каждого учебного предмета (
Затем я применил стандартную функцию
sum()к этому списку.
(Для кандидата "Vassya" получим215- сумму 58 + 62 + 95.)Результат — сумму баллов — поместим в словарь как значение ключа
"sum_of_scores":candidate["sum_of_scores"] = sum( ... )Хотя такой ключ в словаре
candidateпока не существовал, он автоматически создается.За двоеточием в части
{candidate["sum_of_scores"]:>3}f-стринга:- знак
>значит «заровнять вправо» (что является красивым для чисел);
другие альтернативы:<влево,^центровать, - число
3значит, сколько позиций резервируется для вывода (в их пределах будет число заровняться или центроваться).
- знак