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

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

Похожие вопросы
Greenway Global Новосибирск
от 150 000 ₽
SPA2099 Москва
До 100 000 ₽
HR Prime Москва
от 300 000 до 3 800 000 ₽