@nihi1ist

Как правильно отсортировать список экземпляров класса через sorted по атрибуту?

Выполнил задачу:
Реализуйте модель с именем Student, содержащую поля: «ФИ», «Номер группы», «Успеваемость» (список из пяти элементов). Затем создайте список из десяти студентов (данные о студентах можете придумать свои или запросить их у пользователя) и отсортируйте его по возрастанию среднего балла. Выведите результат на экран.

Код
class Student:

    def __init__(self, student_index, surname_name='Иванов Иван', group_number='5A', grades=None):
        self.index = student_index
        self.surname_name = surname_name
        self.group_number = group_number
        self.grades = grades

    def print_info(self):
        print(f'Фамилия: {self.surname_name}\nНомер группы: {self.group_number}\nУспеваемость: {self.grades}')


class Faculty:

    def __init__(self, number):
        self.students = [Student(index) for index in range(1, number + 1)]

    def fill_data(self):
        print('Заполните данные студентов.')
        for index, student in enumerate(self.students):
            surname_and_name = input(f'Введите Фамилию и Имя {index + 1}-го студента: ')
            group_number = input('Введите номер группы студента: ')
            student_grades = []
            for grade_index in range(5):
                while True:
                    try:
                        grade = int(input(f'Введите {grade_index+1}-ю оценку студента: '))
                        student_grades.append(grade)
                    except ValueError:
                        print('Введено некорректное значение. Попробуйте ещё раз…')
                        continue
                    else:
                        break
            print()
            student.surname_name = surname_and_name
            student.group_number = group_number
            student.grades = student_grades

    def sort_by_average(self):
        students_range = len(self.students)
        for number in range(students_range - 1):
            for index in range(students_range - number - 1):
                curr_average_grade = sum(self.students[index].grades) / len(self.students[index].grades)
                next_average_grade = sum(self.students[index + 1].grades) / len(self.students[index + 1].grades)
                if curr_average_grade > next_average_grade:
                    self.students[index], self.students[index + 1] = self.students[index + 1], self.students[index]

    def print_info(self):
        for student in self.students:
            student.print_info()


add_students = Faculty(5)
add_students.fill_data()
add_students.sort_by_average()
add_students.print_info()

Можно ли в методе sort_by_average прикрутить sorted() по среднему значению всех оценок студента? Если да, то как это сделать?
  • Вопрос задан
  • 1543 просмотра
Решения вопроса 1
@o5a
В стандартной sorted можно напрямую указывать функцию, которая будет использоваться в качестве критерия сортировки (параметр key). Выдаваемое этой функцией значение для каждого элемента как раз и будет использовано как значения для сортировки элементов. Также мы можем использовать lambda-функции для упрощения нашей задачи. Таким образом, мы можем напрямую указать, как сортировать наших студентов.
Например, подобное выдаст список студентов, отсортированный по сумме оценок:
sorted(self.students, key=lambda x: sum(x.grades))
Аналогичным образом можете получить сортировку по средней оценке путем небольшой доработки.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы