Редактировать словарь, используя только понимание списка - PullRequest
0 голосов
/ 22 марта 2019

Данные хранятся в списке, элементами которого являются словари, где каждый словарь содержит данные для одного учащегося: идентификационный номер учащегося, имя субъекта, а также количество баллов, которые он / она набрал за каждый из два частичных экзамена, соответственно. Формат каждого словаря следующий:

{'ID' : _IDnumber_, 'subject' : _'Artificial Intelligence'_, 'Partial Exam 1' : _points1_, 'Partial Exam 2' : _points2_}

Теперь мне нужно определить функцию sum_partials(), которая получает один аргумент - список словарей, содержащих данные учеников (как описано выше), и возвращает тот же список, но измененный таким образом, что каждый словарь будет содержать только общий балл (т. е. сумма баллов) частичных экзаменов вместо баллов за два частичных экзамена.

Ex. Результат:

[{'ID': 12217, 'subject': 'Artificial Intelligence', 'Total score': 55}, {'ID': 13022, 'subject': 'Artificial Intelligence', 'Total score': 85}, {'ID': 13032, 'subject': 'Artificial Intelligence', 'Total score': 47}]

Я сделал это с помощью функции редактирования каждого учащегося, функцию которой я вызываю как выражение в понимании списка:

def sum_partials(results):
    # your code here

  def update_student(student):
    partial_exam1 = student['Partial Exam 1']
    partial_exam2 = student['Partial Exam 2']
    student.pop('Partial Exam 1')
    student.pop('Partial Exam 2')
    student['Total score'] = partial_exam1 + partial_exam2
    return student

  return [update_student(student) for student in results]

Он отлично работает, но я новичок в Python, и мне интересно, смогу ли я изменить свой код !? Есть ли решение сделать это в одной строке, используя только списочные или вложенные списочные? Я имею в виду, чтобы делать все, что мне нужно, без функции update_student(), а только с помощью list comprehensions?

Ответы [ 2 ]

0 голосов
/ 22 марта 2019

Вы можете использовать следующий listcomp:

lst = [{'ID': 12217, 'subject': 'Artificial Intelligence', 'Partial Exam 1' : 10, 'Partial Exam 2' : 20}]

[{'ID': i['ID'], 'subject': i['subject'], 'Total score': i['Partial Exam 1'] + i['Partial Exam 2']} for i in lst]
# [{'ID': 12217, 'subject': 'Artificial Intelligence', 'Total score': 30}]
0 голосов
/ 22 марта 2019

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

Здесь простой цикл for, проходящий по вашему списку студентовпросто отлично.

def sum_partials(list_of_students): 
    for student in list_of_students:
        student['Total score'] = student.pop('Partial Exam 1') + student.pop('Partial Exam 2')

    return list_of_students

Спасибо @BoarGules за компактный однострочный расчет с pop.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...