Как реализовать функцию на словаре, возвращающую список студентов, сдавших курс по проходному баллу
Что проверяют
Базовую работу со словарём: items(), списковое включение, граничное условие. Задача простая, поэтому интервьюер смотрит, задаёте ли вы вопросы о данных. Следом просят отсортировать результат, посчитать средний балл по нескольким оценкам или обработать пропуски.
Как отвечать
Уточните формат данных ({имя: балл} или {имя: [оценки]}), строгое или нестрогое сравнение с порогом и нужен ли определённый порядок. Базовая версия в одну строку:
def passed(scores: dict[str, float], threshold: float) -> list[str]:
return [name for name, score in scores.items() if score >= threshold]Дальше покажите, что понимаете детали:
- порядок: с Python 3.7 словарь гарантированно хранит порядок вставки, поэтому результат идёт в том же порядке. Для рейтинга подойдёт
sorted(result, key=scores.get, reverse=True); - несколько оценок: средний балл через
statistics.fmean(grades). На пустом списке он бросаетStatisticsError, а ручное деление даётZeroDivisionError, поэтому пустые списки нужно обработать заранее; - пропуски: сравнение
Noneс числом в Python 3 бросаетTypeError. Решите явно, считать такого студента не сдавшим или пропустить; - тип результата: список можно перебирать сколько угодно раз. Генератор ленивый и экономит память, но проходится один раз;
- аннотации:
dict[str, float]пишется без импорта изtyping, начиная с Python 3.9; - альтернатива:
filterсlambdaтоже работает, но списковое включение читается проще и обычно считается идиоматичнее.
Где спотыкаются
Ставят > вместо >=, и студент с баллом ровно на пороге оказывается не сдавшим. Стоит спросить, что значит «сдал», и назвать выбор вслух.
Используют имя как ключ, не задумываясь. Два однофамильца молча перезапишут друг друга: ключи словаря уникальны. Надёжнее идентификатор или список записей, например dataclass с полями id, name, score.
Удаляют несдавших прямо из словаря в цикле по нему. Получают RuntimeError: dictionary changed size during iteration, а если обойти ошибку копией ключей, функция всё равно портит входные данные вызывающего кода.