Объединение частей словарей для сравнения - PullRequest
0 голосов
/ 28 октября 2019

У меня есть случай, когда я хотел бы сравнить данные между словарями, вложенными в другой словарь. Все вложенные словари имеют одинаковый формат;это выглядит так:

students = {"student_1": {"id":1009, "first_name": "Alex", "last_name": "Robertson",
                          "Assignments":[("Assignment_1",3),("Assignment_2", 4),
                                         ("Assignment_3", 2), ("Assignment_4", 4)]},
            "student_2" :{"id":2009, "first_name": "Dave", "last_name": "Davidson",
                          "Assignments":[("Assignment_1",2),("Assignment_2", 1),
                                         ("Assignment_3", 2), ("Assignment_4", 4)]},
            "student_3" :{"id":3009, "first_name": "Hayden", "last_name": "Miles",
                          "Assignments":[("Assignment_1",1),("Assignment_2", 1),
                                         ("Assignment_3", 1), ("Assignment_4", 1)]},
            "student_4" :{"id":4009, "first_name": "Randy", "last_name": "Bacon",
                          "Assignments":[("Assignment_1",2),("Assignment_2", 2),
                                         ("Assignment_3", 2), ("Assignment_4", 4)]},
            "student_5" :{"id":5009, "first_name": "Katrina", "last_name": "Lopez",
                          "Assignments":[("Assignment_1",2),("Assignment_2", 1),
                                         ("Assignment_3", 2), ("Assignment_4", 3)]},
            "student_6" :{"id":6009, "first_name": "Tessa", "last_name": "Franklin",
                          "Assignments":[("Assignment_1",1),("Assignment_2", 4),
                                         ("Assignment_3", 2), ("Assignment_4", 4)]}}

Что я хотел бы сделать, это указать конкретное назначение (строки в кортежах) и извлечь все шесть классов, связанных с этим назначением, и сопоставить его с идентификационным номером. студента. Например, если бы я хотел оценки для Assignment_1, результатом был бы список кортежей с идентификатором и оценкой из Assignment_1 или упорядоченный список student_ #. Любая помощь очень ценится, вот что я пытался использовать:

def highest_n_grades(dict, tuple, int):
    save_data = []
    for d in dict:
     for k in d:
        if k == "Assignments":
            if [0] == tuple:
                data = d["id"],d["first_name"],d["last_name"],k[1]
                save_data.append(data)
    return save_data

Код выполняется, но возвращает только пустые скобки.

Ответы [ 2 ]

0 голосов
/ 28 октября 2019

Я немного изменил ваш код, чтобы понять. Этот код извлекает оценки учеников по заданию.

def highest_n_grades(dict, tuple):
save_data = []
for d_id,d_info in dict.items():
    assignments = d_info['Assignments']
    for el in assignments:
        if el[0] == tuple:
            data = d_info["id"],d_info["first_name"],d_info["last_name"],el[1]
            save_data.append(data)
return save_data

Вариант использования:

highest_n_grades(students,'Assignment_1')

 [(1009, 'Alex', 'Robertson', 3),
 (2009, 'Dave', 'Davidson', 2),
 (3009, 'Hayden', 'Miles', 1),
 (4009, 'Randy', 'Bacon', 2),
 (5009, 'Katrina', 'Lopez', 2),
 (6009, 'Tessa', 'Franklin', 1)]
0 голосов
/ 28 октября 2019

Ваш оператор if всегда будет ложным, поскольку вы сравниваете список с одним значением в строке.

Вы можете попробовать это так (при условии, что "tuple" - строка):

search_assignment = "Assignment_1"

def highest_n_grades(students, search_assignment):
    save_data = []
    for student in students:
        student_data = students[student]
        assignments = student_data["Assignments"]
        for assignment in assignments:
            if assignment[0] is search_assignment:
                data = (student_data["id"], student_data["first_name"], student_data["last_name"], assignment[1])
                save_data.append(data)
...