Сортировка списка в Python: sort и sorted
Автор: Казачкин Даниил Михайлович · Обновлено
Метод list.sort изменяет исходный список и возвращает None. Функция sorted принимает любую перебираемую последовательность и создаёт новый список, оставляя источник без изменений. Выбор зависит от того, нужна ли прежняя последовательность.
Два результата рядом
scores = [72, 95, 68, 95]
ascending = sorted(scores)
descending = sorted(scores, reverse=True)
print(scores)
print(ascending)
print(descending)Вывод:
[72, 95, 68, 95]
[68, 72, 95, 95]
[95, 95, 72, 68]Повторы сохраняются. Исходный scores не изменён, потому что использована sorted.
Ключ сортировки
Параметр key задаёт значение для сравнения. sorted(words, key=len) упорядочит слова по длине, но вернёт сами слова. Для строк без учёта регистра подходит key=str.lower. Алгоритм сортировки стабилен: элементы с одинаковым ключом сохраняют взаимный порядок.
Типичная ошибка values = values.sort(): после неё values станет None. Вызов sort нужен отдельной строкой. Смешанные несравнимые типы, например числа и строки, вызывают TypeError. Сортировка числовых строк лексикографически ставит '10' раньше '2'; сначала преобразуйте их в int.
Рейтинг без потери исходника
Для списка результатов [14, 7, 21, 14] создайте убывающую копию и выведите три лучших значения. Убедитесь, что исходный список прежний. Затем отсортируйте слова ['Груша', 'яблоко', 'Мак'] по длине и отдельно — по алфавиту без учёта регистра. Предскажите порядок до запуска и объясните роль key в каждом варианте.
Сортировка как отдельное решение
Возьмите список слов с разным регистром и одинаковой длиной. Создайте три результата: обычный лексикографический порядок, порядок без учёта регистра и порядок по паре «длина, нижний регистр». Не меняйте исходный список, чтобы сравнить варианты рядом. Затем используйте sort на копии и проверьте возвращаемое значение метода. Зафиксируйте правило для равных ключей: стабильность сохраняет прежний взаимный порядок. Это позволяет делать многоступенчатую сортировку, но ключ-кортеж обычно яснее. Подберите тест, где разные стратегии действительно дают разные результаты.
Практикум: сортировка без потери исходного порядка
Есть список результатов в порядке финиша. Получите таблицу по возрастанию баллов, сохранив исходный порядок для отчёта. Сравните sorted(results) и results.sort() по возвращаемому значению и изменению объекта. Проверьте повторы и сортировку пар (score, name) по выбранному ключу. Для равных баллов сформулируйте правило и исследуйте стабильность сортировки. Создайте тест, который после операции сравнивает исходный список с заранее сохранённым ожидаемым порядком.
Контрольная точка
Почему присваивание ordered = results.sort() даёт None? Объясните контракт метода, изменяющего список на месте, и функции, возвращающей новую коллекцию.
Частые вопросы
Как сортировать по убыванию?
У sorted и list.sort есть параметр reverse=True. Для сложного объекта задают key. Отрицание числового ключа иногда работает, но явный параметр лучше передаёт намерение.
Связанные исследования
- AlphaDev: как обучение с подкреплением нашло более быстрые алгоритмы сортировки — Разбираем AlphaDev без громких обобщений: поиск ассемблерных программ, проверка корректности, benchmark и интеграция малых сортировок в LLVM libc++.