Сортировка списков в Python

Кратко: в Python есть два основных способа сортировки — метод списка list.sort() и функция built-in sorted(). list.sort() меняет исходный список на месте, sorted() возвращает новый отсортированный список. Оба принимают ключ (key) и флаг обратного порядка (reverse). Ниже — понятные примеры, подсказки по словарям, вложенным структурам, случаи, где сортировка не сработает, и практический чек‑лист.
Что делает сортировка и зачем она нужна
Сортировка упорядочивает элементы по возрастанию или убыванию. Это важно при подготовке данных для отображения пользователю, при агрегации, при объединении результатов из API или БД, а также при оптимизации поиска и фильтрации.
Важно: сортировка не заменяет нормализацию данных. Перед сортировкой убедитесь, что типы и формат значений одинаковы.
Как сортировать список в Python
Для сортировки списков используется метод list.sort(). Он изменяет список на месте и возвращает None.
Синтаксис:
list.sort(key=function, reverse=True/False)Параметры:
- key: функция, возвращающая значение, по которому сравниваются элементы (необязательный).
- reverse: если True — порядок обратный (убывающий). По умолчанию False.
Пример базовой сортировки строк:
myList = ["C", "D", "B", "A", "F"]
myList.sort()
print(myList)
# Output: ['A', 'B', 'C', 'D', 'F']Сортировка в обратном порядке:
myList = ["C", "D", "B", "A", "F"]
myList.sort(reverse=True)
print(myList)
# Output: ['F', 'D', 'C', 'B', 'A']Сортировка по длине строк с использованием key-функции:
myList = ["MUO", "Python", "JavaScript", "Sort", "Sortlists"]
def sortLength(item):
return len(item)
myList.sort(reverse=True, key=sortLength)
print(myList)
# Output: ['JavaScript', 'Sortlists', 'Python', 'Sort', 'MUO']Совет: для простых ключей используйте lambda-функции.
Сортировка списка словарей
Списки словарей часто встречаются при работе с данными. Для сортировки передавайте key, который возвращает поле словаря.
Пример — сортировка задач по времени:
myArray = [
{"Task": "Wash", "Time": 12.00},
{"Task": "Football", "Time": 24.00},
{"Task": "Sort", "Time": 17.00},
{"Task": "Code", "Time": 15.00}
]
def sortByTime(item):
return item["Time"]
myArray.sort(key=sortByTime)
print(myArray)Результат упорядочивает элементы по значению поля Time по возрастанию. Чтобы сортировать по строковому полю Task, возвращайте item[“Task”]. Для компактности можно написать так:
myArray.sort(key=lambda x: x["Time"], reverse=True)
print(myArray)Замечание: если некоторые словари не содержат ключа, key-функция должна корректно обрабатывать это (например, возвращать значение по умолчанию или исключать элемент).
См. также: Как работают массивы и списки в Python
Сортировка вложенных списков и кортежей
Если элементы списка — кортежи или вложенные структуры, key обычно возвращает элемент по индексу.
Пример: сортируем по третьему элементу каждого кортежа:
Alist = [(3, 19, 20), (2, 6, 0), (1, 8, 15), (7, 9, 3), (10, 19, 4)]
def sortByThirdIndex(a):
return a[2]
Alist.sort(key=sortByThirdIndex)
print(Alist)
# Output: [(2, 6, 0), (7, 9, 3), (10, 19, 4), (1, 8, 15), (3, 19, 20)]Аналог с lambda и функцией sorted, возвращающей новый список:
Alist = [(3, 19, 20), (2, 6, 0), (1, 8, 15), (7, 9, 3), (10, 19, 4)]
newList = sorted(Alist, key=lambda a: a[2])
print(newList)
# Output: [(2, 6, 0), (7, 9, 3), (10, 19, 4), (1, 8, 15), (3, 19, 20)]Важно: множества (set) не индексируемы, поэтому подобная сортировка по индексу невозможна без преобразования в список.
sorted() против list.sort()
Функция sorted() возвращает новый отсортированный список, не меняя исходный объект. Поддерживает те же параметры key и reverse.
Синтаксис:
sorted(iterable, key=function, reverse=True/False)Пример:
Alist = [(3, 19, 20), (2, 6, 0), (1, 8, 15), (7, 9, 3), (10, 19, 4)]
def getIndex(a):
return a[2]
newList = sorted(Alist, key=getIndex)
print(newList)
# Output: [(2, 6, 0), (7, 9, 3), (10, 19, 4), (1, 8, 15), (3, 19, 20)]Когда использовать что:
- Используйте list.sort(), если хотите изменить список на месте и сэкономить память.
- Используйте sorted(), если нужно сохранить исходный порядок и получить новый список.
Когда сортировка может не сработать
- Разные типы в одном списке (например, числа и строки) приведут к ошибке или непредсказуемому порядку.
- Присутствуют None или отсутствующие ключи в словарях — ключ-функция должна это учитывать.
- Неиндексируемые структуры (set) требуют преобразования в list.
- Для больших объёмов данных сортировка в памяти может быть неэффективной — рассматривайте внешнюю сортировку или потоковую обработку.
Альтернативные подходы
- heapq.nsmallest/nlargest — ищет k наименьших/наибольших элементов без полной сортировки.
- itertools.islice + sorted — для частичной выборки из потока.
- Параллельная/внешняя сортировка для очень больших данных (внешний merge sort).
- Pandas DataFrame.sort_values() — удобен при табличных данных.
Практический мини‑метод (шаги)
- Проверить типы элементов и нормализовать значения.
- Решить, нужно ли изменять исходный список (sort) или получать новый (sorted).
- Определить ключ сортировки (lambda или функция).
- Тестировать на граничных случаях: пустой список, повторяющиеся значения, отсутствующие ключи.
- Если данные большие — профилировать использование памяти и времени.
Контрольный список для ролей
Разработчик:
- Нормализовать данные перед сортировкой.
- Выбрать sort или sorted.
- Обработать исключения для отсутствующих ключей.
Data Engineer:
- Оценить объём данных и применимость внешней сортировки.
- Рассмотреть частичную выборку через heapq.
QA / Тестировщик:
- Проверить поведение на пустых и сильно повторяющихся наборах.
- Проверить стабильность сортировки для равных ключей (Python использует стабильную сортировку).
Критерии приёмки
- Функция возвращает корректный порядок для положительных и отрицательных тестов.
- Исходные данные не изменяются, если это оговорено.
- Нет необработанных исключений при отсутствии ключей.
Короткий глоссарий
- key: функция, возвращающая значение, по которому сравниваются элементы.
- reverse: булево значение, включающее обратный порядок.
- стабильная сортировка: при равных ключах сохраняется исходный порядок элементов.
Итог
Сортировка в Python гибкая и мощная. Для большинства задач достаточно list.sort() или sorted() с ключом и опцией reverse. В продакшн‑коде всегда проверяйте типы, обрабатывайте отсутствующие значения и выбирайте метод в зависимости от требований по памяти и неизменности исходных данных.
См. также: Что такое set в Python и как его создать