Функция sort_scores(scores) сортирует оценки по возрастанию быстрой сортировкой, но часть оценок теряется. В ней две ошибки — найдите и исправьте их.
Примеры
sort_scores([4, 2, 5, 2, 3]) # [2, 2, 3, 4, 5]
sort_scores([5]) # [5]
Функция sort_scores(scores) сортирует оценки по возрастанию быстрой сортировкой, но часть оценок теряется. В ней две ошибки — найдите и исправьте их.
sort_scores([4, 2, 5, 2, 3]) # [2, 2, 3, 4, 5]
sort_scores([5]) # [5]
Заготовка задачи обновилась с тех пор, как вы сохранили свой код.
Сбросить редактор к заготовке? Ваш код будет удалён.
def sort_scores(scores: list[int]) -> list[int]:
"""Возвращает новый список оценок по возрастанию (быстрая сортировка)."""
if len(scores) < 2:
return []
pivot = scores[0]
less = [s for s in scores[1:] if s < pivot]
greater = [s for s in scores[1:] if s > pivot]
return sort_scores(less) + [pivot] + sort_scores(greater)Вывод обрезан: показаны первые строки.
def test_example():
"""Пример: [4, 2, 5, 2, 3] → [2, 2, 3, 4, 5]"""
got = sort_scores([4, 2, 5, 2, 3])
assert got == [2, 2, 3, 4, 5], f"получено {got!r}"
def test_single():
"""Одна оценка → та же оценка"""
got = sort_scores([5])
assert got == [5], f"получено {got!r}"
def test_empty():
"""Пустой список → []"""
got = sort_scores([])
assert got == [], f"получено {got!r}"
def test_two():
"""Две оценки в обратном порядке"""
got = sort_scores([5, 3])
assert got == [3, 5], f"получено {got!r}"
def test_all_equal():
"""Все оценки одинаковые — ни одна не теряется"""
got = sort_scores([4, 4, 4, 4])
assert got == [4, 4, 4, 4], f"получено {got!r}"
def test_length_preserved():
"""Длина результата равна длине входа"""
data = [3, 5, 2, 4, 5, 3, 2, 5]
got = sort_scores(data)
assert len(got) == len(data), f"было {len(data)} оценок, стало {len(got)}: {got!r}"
assert got == sorted(data), f"получено {got!r}"Можно решать и в своём редакторе: «Скопировать с тестами» и запустите python3 sort_scores.py — тесты те же, результат покажет ✓ / ✗ и итог.
Сравните длину результата с длиной входа. Каких элементов не хватает?
Что должен вернуть базовый случай для списка из одного элемента?
Куда попадает элемент, равный опорному? Проверьте оба условия разбиения.
def sort_scores(scores: list[int]) -> list[int]:
"""Возвращает новый список оценок по возрастанию (быстрая сортировка)."""
if len(scores) < 2:
return list(scores)
pivot = scores[0]
less = [s for s in scores[1:] if s < pivot]
greater = [s for s in scores[1:] if s >= pivot]
return sort_scores(less) + [pivot] + sort_scores(greater)