Как сортировать список в Python

Что такое сортировка списков в Python
Сортировка списка упорядочивает элементы по возрастанию или убыванию. В Python есть два основных инструмента:
- list.sort() — метод списка, меняет список на месте (in‑place) и возвращает None;
- sorted() — встроенная функция, возвращает новую отсортированную копию, оригинал не меняется.
Кратко: если нужно сохранить исходный список — используйте sorted(), если нужно снизить потребление памяти и менять список прямо — list.sort().
Основной синтаксис
Метод sort и функция sorted принимают одинаковые ключевые аргументы:
list.sort(key=function, reverse=True/False)
sorted(iterable, key=function, reverse=True/False)- key — функция, по значению которой сравниваются элементы (например, len или lambda);
- reverse — булево значение: False (по умолчанию) для возрастания, True для убывания.
Пример базовой сортировки строк:
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)
Если нужно сортировать по какому‑то производному значению элемента, передайте функцию в 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:
myList.sort(key=lambda x: len(x), reverse=True)Сортировка списка словарей
Чтобы сортировать список словарей, используйте ключ, возвращающий значение по нужному ключу словаря.
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)То же через lambda:
myArray.sort(key=lambda x: x["Time"]) # чище и компактнееЧтобы сортировать по названию задачи, верните item[“Task”]. Для обратного порядка добавьте reverse=True.
Совет: для небольшого выигрыша в производительности используйте operator.itemgetter:
from operator import itemgetter
myArray.sort(key=itemgetter('Time'))Сортировка вложенных списков и кортежей
Если у вас список кортежей/списков и нужно сортировать по индексу, используйте 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():
newList = sorted(Alist, key=lambda a: a[2])
print(newList)Важно: нельзя индексировать set — поэтому сортировать множества таким способом нельзя; сначала преобразуйте в список: list(myset).
sorted() — когда нужна копия
sorted() возвращает новую структуру, не трогая исходную:
Alist = [(3, 19, 20), (2, 6, 0), (1, 8, 15)]
newList = sorted(Alist, key=lambda a: a[2])
print(newList)
# Alist остаётся без измененийЧастые ошибки и когда сортировка не сработает
- Попытка сравнить несопоставимые типы (например, int и str) в Python 3 приведёт к TypeError.
- Сортировка множества напрямую невозможна — используйте list(myset).
- Нестабильный источник ключей: если ключ даёт одинаковые значения, порядок между равными элементами сохраняется (Python использует стабильную сортировку), но если вы рассчитываете на другую логику — уточните key.
- Локализация строк: для корректной сортировки слов с диакритикой используйте locale.strxfrm.
Пример использования locale для строк:
import locale
locale.setlocale(locale.LC_COLLATE, 'ru_RU.UTF-8') # пример для Linux, на Windows локали отличаются
names.sort(key=locale.strxfrm)Производительность и поведение
- Python использует алгоритм Timsort — адаптивная сортировка со сложностью в среднем O(n log n). Алгоритм стабильный.
- Для больших списков избегайте многократной пересортировки: лучше собрать критерии и сортировать один раз.
- Для сложных сравнений можно использовать functools.cmp_to_key, но предпочтительнее привести элемент к ключу (key), это обычно быстрее и чище.
Альтернативные подходы
- heapq.nsmallest / nlargest — чтобы получить лишь несколько наименьших/наибольших элементов без полной сортировки.
- pandas.DataFrame.sort_values — для табличных наборов данных в аналитике.
- sorted с ключом, который кеширует расчёт ключа вручную (decorate‑sort‑undecorate) — иногда полезно, если вычисление ключа дорогое.
Мини‑чек‑лист для разработчика
- Нужно ли менять исходный список? Если нет — используйте sorted().
- Правильно ли выбран key (len, lambda, itemgetter)?
- Обработаны ли смешанные типы и None?
- Нужно ли учитывать локаль для строк?
- Используется ли reverse корректно вместо reversed() на уже отсортированном списке?
Критерии приёмки
- Функция/метод возвращает отсортированный список в ожидаемом порядке.
- Оригинальный список остаётся нетронутым, если это требование (sorted()).
- Для равных ключей порядок остаётся предсказуемым (стабильная сортировка).
- Тесты покрывают граничные случаи: пустой список, список с одним элементом, смешанные типы, None.
Примеры тестов/кейсов приёма
- Сортировка чисел: [3,1,2] → [1,2,3]
- Сортировка строк: [“b”,”a”] → [“a”,”b”]
- Сортировка по ключу: [{‘x’:2},{‘x’:1}] → по x → [{‘x’:1},{‘x’:2}]
- Попытка сортировки смешанных типов должна давать ясную ошибку или предобработку.
Важно: избегайте «тихих» ловушек — всегда проверяйте, что key возвращает ожидаемые типы.
Короткий глоссарий
- key — функция, возвращающая значение для сравнения элементов;
- reverse — флаг для обратного порядка;
- in‑place — изменение структуры данных без создания новой копии;
- стабильная сортировка — сохранение порядка равных элементов.
Роль‑ориентированные советы
- Разработчику: используйте itemgetter и lambda для читаемого и быстрого кода; профилируйте вычисление ключа.
- Аналитику: при работе с табличными данными используйте pandas для удобной сортировки и фильтрации.
- Тестировщику: добавьте тесты на пустой ввод, None и смешанные типы.
Краткое резюме
Сортировка списков в Python проста, но требует внимания к типам данных и целям (изменить список на месте или получить новую копию). Используйте key и reverse для управления порядком, lambda и operator.itemgetter для читабельности и эффективности. Учтите локализацию при сортировке строк и обрабатывайте смешанные типы заранее.
См. также: как работают массивы и списки в Python; что такое set и как его создавать.
Похожие материалы
RDP: полный гид по настройке и безопасности
Android как клавиатура и трекпад для Windows
Советы и приёмы для работы с PDF
Calibration в Lightroom Classic: как и когда использовать
Отключить Siri Suggestions на iPhone