Попытка найти суммы уникальных значений во вложенном словаре.(См пример!) - PullRequest
0 голосов
/ 14 ноября 2018

Допустим, у меня есть эта переменная list_1, которая представляет собой список словарей.Каждый словарь имеет вложенный словарь под названием «группа», в котором содержится некоторая информация, включая «имя».

Я пытаюсь суммировать оценки каждого уникального имени группы .

Поэтому я ищу вывод, похожий на:

Всего баллов в (Керамика) = (18)
Всего баллов в (Математика) = (20)
ВсегоРезультаты в (История) = (5)

У меня есть выше информация в скобках, потому что я хотел бы, чтобы этот код работал независимо от количества элементов в списке, или количество уникальныхпредставленные группы.

Переменная list_1:

    list_1 = [

    {"title" : "Painting",
     "score" : 8,
     "group" : {"name" : "Ceramics",
                "id" : 391}
     },

    {"title" : "Exam 1",
     "score" : 10,
     "group" : {"name" : "Math",
                "id" : 554}
     },

    {"title" : "Clay Model",
     "score" : 10,
     "group" : {"name" : "Ceramics",
                "id" : 391}
     },

    {"title" : "Homework 3",
     "score" : 10,
     "group" : {"name" : "Math",
                "id" : 554}
     },

    {"title" : "Report 1",
     "score" : 5,
     "group" : {"name" : "History",
                "id" : 209}
     },

    ]

Моя первая идея состояла в том, чтобы создать новую переменную списка и добавить каждое уникальное имя группы.Вот код для этого.Но поможет ли это в конечном итоге найти сумму баллов для каждого из них?

group_names_list = []
for item in list_1:
    group_name = item["group"]["name"]
    if group_name not in group_names_list:
        group_names_list.append(group_name)

Это дает мне значение group_names_list как:

['Ceramics','Math','History']

Любая помощь или предложенияоценили!Спасибо.

Ответы [ 3 ]

0 голосов
/ 14 ноября 2018

Вы можете использовать диктовку, чтобы отслеживать оценки по имени:

score_dict = dict()
for d in list_1:
    name = d['group']['name']
    if name in score_dict:
        score_dict[name] += d['score']
    else:
        score_dict[name] = d['score']

print(score_dict)

РЕЗУЛЬТАТЫ: {«Керамика»: 18, «Математика»: 20, «История»: 5}

0 голосов
/ 14 ноября 2018

Оба ответа @JacobIRR и @JoranBeasley великолепны, в качестве альтернативы вы можете сделать следующее:

data = [
    {"title": "Painting", "score": 8, "group": {"name": "Ceramics", "id": 391}},
    {"title": "Exam 1", "score": 10, "group": {"name": "Math", "id": 554}},
    {"title": "Clay Model", "score": 10, "group": {"name": "Ceramics", "id": 391}},
    {"title": "Homework 3", "score": 10, "group": {"name": "Math", "id": 554}},
    {"title": "Report 1", "score": 5, "group": {"name": "History", "id": 209}}
]

result = {}
scores = iter((e['group']['name'], e['score']) for e in data)
for name, score in scores:
    result[name] = result.get(name, 0) + score

print(result)

Вывод

{'Ceramics': 18, 'History': 5, 'Math': 20}
0 голосов
/ 14 ноября 2018
data = {}
for item in list_1: # for each item in our list
   # set our category to its existing value (or 0) + the new score
   data[item['group']['name']] = item['score'] + data.get(item['group']['name'],0)

print(data) # output = {'History': 5, 'Math': 20, 'Ceramics': 18}

тогда вы можете распечатать его достаточно просто используя строки формата

for group_name,scores_summed in data.items():
    print("Totals for {group_name} = {scores_summed}".format(group_name=group_name,scores_summed=scores_summed))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...