Чтобы отсортировать список в Python, вызовите у него метод sort(): nums.sort() упорядочит элементы по возрастанию прямо в этом же списке. Если исходный порядок нужно сохранить, берите встроенную функцию sorted(nums): она вернёт новый отсортированный список, а старый не тронет.
Обратный порядок включается параметром reverse=True, а своё правило сортировки (по длине, по полю, без учёта регистра) задаёт параметр key. Ниже разбираем оба инструмента на примерах, которые мы запускали в Python 3.14, и ошибки, на которых чаще всего застревают новички. Если вы только поставили интерпретатор, начните с первых простых программ на Python.
Как отсортировать список методом sort()

Метод sort() есть только у списков. Он переставляет элементы на месте и ничего не возвращает, точнее, возвращает None.
- Создайте список:
nums = [5, 2, 9, 1]. - Вызовите метод без аргументов:
nums.sort(). - Выведите сам список:
print(nums). Результат вызова печатать незачем, тамNone.
nums = [5, 2, 9, 1]
res = nums.sort()
print(nums, res)
# [1, 2, 5, 9] None
Элементы сравниваются оператором <: числа по величине, строки по кодам символов. Как ведут себя сами знаки сравнения, мы разбирали в материале про операторы Python. Со строками тут есть сюрприз, о нём ниже в разделе про русские слова.
В документации Python сказано, что метод сортирует список на месте ради экономии памяти на больших последовательностях и намеренно не возвращает результат, чтобы напомнить: он работает через побочный эффект.
Чем sort() отличается от sorted()
Функция sorted() принимает любой итерируемый объект (список, кортеж, строку, множество, словарь) и всегда возвращает новый список. Исходные данные остаются как были.
nums = [5, 2, 9, 1]
new = sorted(nums)
print(new, nums)
# [1, 2, 5, 9] [5, 2, 9, 1]| list.sort() | sorted() | |
|---|---|---|
| Что сортирует | только список | любой итерируемый объект |
| Что возвращает | None |
новый список |
| Исходные данные | меняются | не меняются |
| Параметры | key, reverse |
key, reverse |
| Когда брать | старый порядок больше не нужен | нужен и старый порядок, и новый, или данные не в списке |
В руководстве по сортировке на python.org про метод сказано, что обычно он менее удобен, чем sorted(), но немного эффективнее, если исходный список вам не нужен. У sorted() есть родня среди встроенных функций: sum(), min() и max() тоже принимают любой итерируемый объект и не меняют его. Как посчитать сумму элементов, мы показали в инструкции о том, как суммировать список в Python.
Мы в примерах по умолчанию берём sorted(): исходные данные остаются целыми, и меньше шансов случайно записать в переменную None. Метод оставляем для случаев, когда старый порядок точно не понадобится.
Сортировка по убыванию: параметр reverse
Оба инструмента принимают reverse=True. Список встанет от большего к меньшему.
print(sorted([5, 2, 9, 1], reverse=True))
# [9, 5, 2, 1]
nums = [5, 2, 9, 1]
nums.sort(reverse=True)
print(nums)
# [9, 5, 2, 1]
Параметры key и reverse передаются только по имени. Запись nums.sort(True) не сработает, нужно именно reverse=True.
Путать reverse=True с методом reverse() не стоит. Метод nums.reverse() ничего не сортирует, он просто разворачивает текущий порядок: из [5, 2, 9] получится [9, 2, 5].
Параметр key: сортировка по своему правилу
В key передают функцию от одного аргумента. Python вызывает её для каждого элемента и сравнивает уже результаты. По руководству python.org, ключ считается ровно один раз на элемент, поэтому такой приём работает быстро.
По длине строки
print(sorted(["python", "go", "c", "rust"], key=len))
# ['c', 'go', 'rust', 'python']
Без учёта регистра
Заглавные буквы в Unicode идут раньше строчных, поэтому без ключа "Яблоко" окажется впереди "арбуз". Ключ str.lower сравнивает слова так, будто все они написаны маленькими буквами.
words = ["банан", "Яблоко", "арбуз", "вишня"]
print(sorted(words))
# ['Яблоко', 'арбуз', 'банан', 'вишня']
print(sorted(words, key=str.lower))
# ['арбуз', 'банан', 'вишня', 'Яблоко']
По элементу кортежа или полю словаря
Для записей вида «имя и оценка» ключом служит лямбда-функция, которая достаёт нужное поле. Тот же код короче пишется через itemgetter из модуля operator.
from operator import itemgetter
students = [("Аня", 5), ("Борис", 3), ("Вика", 5), ("Глеб", 4)]
print(sorted(students, key=lambda s: s[1], reverse=True))
# [('Аня', 5), ('Вика', 5), ('Глеб', 4), ('Борис', 3)]
users = [{"name": "Аня", "age": 31}, {"name": "Борис", "age": 25}, {"name": "Вика", "age": 28}]
print([u["name"] for u in sorted(users, key=itemgetter("age"))])
# ['Борис', 'Вика', 'Аня']
Если в списке объекты своего класса, ключом станет attrgetter("age") или lambda u: u.age. Как устроены классы и атрибуты, мы разбирали в статье про ООП на Python.
Список списков без ключа сортируется по первому элементу каждой строки, при равенстве по второму. Чтобы упорядочить строки таблицы по другому столбцу, укажите его индекс в ключе.
matrix = [[3, "в"], [1, "б"], [2, "а"]]
print(sorted(matrix))
# [[1, 'б'], [2, 'а'], [3, 'в']]
print(sorted(matrix, key=lambda row: row[1]))
# [[2, 'а'], [1, 'б'], [3, 'в']]
Своей функцией
Когда правило не помещается в одну строку, вынесите его в обычную функцию через def и передайте её имя без скобок. Например, отсортируем почтовые адреса по домену:
def domain(email):
return email.split("@")[1]
emails = ["olga@yandex.ru", "ivan@mail.ru", "anna@gmail.com"]
print(sorted(emails, key=domain))
# ['anna@gmail.com', 'ivan@mail.ru', 'olga@yandex.ru']
Простое условие «если так, то первым» помещается и в лямбду, через тернарный оператор. Так теги с решёткой встанут в начало, остальные после них:
tags = ["#важно", "обед", "#срочно", "спорт"]
print(sorted(tags, key=lambda s: 0 if s.startswith("#") else 1))
# ['#важно', '#срочно', 'обед', 'спорт']
Частая ошибка здесь: написать key=domain() со скобками. Тогда Python попытается вызвать функцию сразу, без аргумента, и упадёт с TypeError.
По нескольким признакам сразу
Ключ может вернуть кортеж. Тогда Python сравнивает первые элементы, при равенстве вторые и так далее. Минус перед числом разворачивает порядок только для этого признака.
# сначала по оценке от большей к меньшей, при равной оценке по имени
print(sorted(students, key=lambda s: (-s[1], s[0])))
# [('Аня', 5), ('Вика', 5), ('Глеб', 4), ('Борис', 3)]
Минус работает только с числами. Для строк используйте сортировку в два прохода, про неё ниже.
Как отсортировать строку, кортеж, множество и словарь
Метода sort() у этих типов нет, а sorted() с ними справляется. Результат всегда список, поэтому строку потом собирают обратно через "".join().
print(sorted("питон"))
# ['и', 'н', 'о', 'п', 'т']
print("".join(sorted("питон")))
# инопт
print(sorted((3, 1, 2)))
# [1, 2, 3]
print(sorted({3, 1, 2}))
# [1, 2, 3]
Со словарём sorted() работает по ключам. Чтобы упорядочить его по значениям, сортируйте пары из items(), а результат при необходимости снова превратите в словарь: с Python 3.7 словари сохраняют порядок вставки.
prices = {"яблоки": 30, "груши": 12, "сливы": 25}
print(sorted(prices))
# ['груши', 'сливы', 'яблоки']
print(sorted(prices.items(), key=lambda kv: kv[1], reverse=True))
# [('яблоки', 30), ('сливы', 25), ('груши', 12)]
print(dict(sorted(prices.items(), key=lambda kv: kv[1])))
# {'груши': 12, 'сливы': 25, 'яблоки': 30}
Русские слова и буква ё
Строки Python сравнивает по номерам символов в Unicode. Для русского алфавита это почти всегда совпадает с привычным порядком, кроме двух случаев.
- Заглавные идут раньше строчных. Решение:
key=str.lower, как в примере выше. - Буква «ё» стоит после «я». Слово «ёж» окажется в конце списка, после «жук».
words = ["ёж", "еда", "жук", "Ёлка"]
print(sorted(words))
# ['Ёлка', 'еда', 'жук', 'ёж']
print(sorted(words, key=lambda w: w.lower().replace("ё", "е")))
# ['еда', 'ёж', 'Ёлка', 'жук']
Замена «ё» на «е» внутри ключа ставит слова туда, где их ищет человек, а сами строки в списке остаются с «ё». Для сортировки по правилам конкретного языка в руководстве python.org советуют locale.strxfrm() в качестве ключа. Учтите, что результат тогда зависит от локали, установленной в системе, и на другом компьютере может отличаться.
Тот же вопрос с алфавитом решают и в таблицах: если данные удобнее хранить в Excel, посмотрите, как сортировать по алфавиту в Excel.
Устойчивость сортировки и сортировка в два прохода

И метод, и функция сортируют устойчиво: документация гарантирует, что элементы с одинаковым ключом сохраняют исходный порядок относительно друг друга. Это видно уже в примере с оценками: Аня и Вика получили по пятёрке и остались в том порядке, в каком стояли.
На устойчивости основан приём «сортировка в несколько проходов». Сначала сортируете по второстепенному признаку, потом по главному. Например, сотрудников по зарплате от большей к меньшей внутри каждой должности:
staff = [("Аня", "аналитик", 120), ("Борис", "дизайнер", 90),
("Вика", "аналитик", 150), ("Глеб", "дизайнер", 110)]
staff.sort(key=lambda s: s[2], reverse=True) # второстепенный признак
staff.sort(key=lambda s: s[1]) # главный признак
print(staff)
# [('Вика', 'аналитик', 150), ('Аня', 'аналитик', 120),
# ('Глеб', 'дизайнер', 110), ('Борис', 'дизайнер', 90)]
Так удобно, когда признаки разных типов и минус к ним не применить. Если данные лежат в базе, ту же задачу решает одна строка ORDER BY с несколькими столбцами, примеры есть в статье про SELECT в MySQL. В руководстве python.org отмечено, что используемый в Python алгоритм Timsort выполняет такие повторные сортировки эффективно, потому что умеет пользоваться порядком, который уже есть в данных.
Если нужны только несколько самых больших или самых маленьких элементов, сортировать весь список не обязательно:
max(),min()иheapq.nlargest(2, nums)принимают тот же параметрkey.
Параметр cmp из Python 2 и функция cmp_to_key
В старых примерах из интернета встречается sorted(data, cmp=...). В Python 3 такого параметра нет, и код падает сразу:
sorted([3, 1, 2], cmp=lambda a, b: a - b)
# TypeError: sort() got an unexpected keyword argument 'cmp'
Функция сравнения получает два элемента и возвращает отрицательное число, ноль или положительное. Чтобы использовать её в Python 3, оберните её в functools.cmp_to_key. В документации модуля functools эта обёртка описана как переходный инструмент для программ, которые переводят с Python 2:
from functools import cmp_to_key
def by_last_digit(a, b):
return a % 10 - b % 10
print(sorted([31, 12, 25, 40], key=cmp_to_key(by_last_digit)))
# [40, 31, 12, 25]
Для новой задачи проще сразу написать ключ: key=lambda x: x % 10 даст тот же результат и читается легче.
Как добавить элемент и не сломать порядок
Если список уже отсортирован, а новые значения приходят по одному, пересортировывать его после каждого добавления не нужно. Модуль bisect вставит элемент сразу на нужное место:
import bisect
scores = [10, 20, 40]
bisect.insort(scores, 30)
print(scores)
# [10, 20, 30, 40]
Обычные способы добавления, append() и insert(), ставят элемент в конец или по индексу, и порядок после них придётся восстанавливать вручную.
Частые ошибки и что с ними делать

| Симптом | Причина | Что делать |
|---|---|---|
После nums = nums.sort() в переменной None |
метод возвращает None, и вы записали его поверх списка |
писать просто nums.sort() или nums = sorted(nums) |
TypeError: '<' not supported between instances of 'str' and 'int' |
в списке смешаны числа и строки, их нельзя сравнить | привести всё к одному типу, например key=int или key=str |
| «10» и «100» стоят раньше «9» | числа хранятся строками и сравниваются посимвольно | sorted(data, key=int) |
AttributeError: 'tuple' object has no attribute 'sort' |
метод есть только у списка | sorted(кортеж) или сначала list() |
| Ошибка при сортировке данных с пропусками | None нельзя сравнить с числом |
отфильтровать: sorted(x for x in data if x is not None) |
Строковые числа выглядят так:
print(sorted(["10", "9", "100"]))
# ['10', '100', '9']
print(sorted(["10", "9", "100"], key=int))
# ['9', '10', '100']
Ещё одна деталь из документации: если какое-то сравнение падает с ошибкой, падает вся сортировка, и список при этом, скорее всего, останется частично переставленным. Поэтому данные из файла или формы сначала чистите, а потом сортируйте.
Где освоить Python системно
Сортировка решается одной строкой, но в реальном коде она стоит рядом с чтением файлов, обработкой ошибок, работой с базами и библиотеками вроде pandas. Чтобы собрать эти навыки в систему и дойти до первой работы, удобнее идти по программе курса с практикой и проверкой кода. Сроки и порядок шагов до первой работы есть в разборе, как стать Python-разработчиком. Программы с ценами и сроками обучения сравнивайте среди курсов по Python или в подборке по профессии Python-разработчик.
| Курс | Школа | Стоимость со скидкой | В рассрочку | Длительность | Обзор курса от Checkroi |
|---|---|---|---|---|---|
| Профессия «Python-разработчик» Перейти на сайт курса | 157 335 ₽ | 5987 ₽/мес. | 10 месяцев | Обзор курса | |
| Fullstack-разработчик на Python Перейти на сайт курса | 161 200 ₽ | 7125 ₽/мес. | 21 месяц | Обзор курса | |
| ДО Профессия Python-разработчик Перейти на сайт курса | 149 001 ₽ | 3167 ₽/мес. | 10 месяцев | Обзор курса | |
| Автоматизированное тестирование на Python Перейти на сайт курса | 118 666 ₽ | 4108 ₽/мес. | 9 месяцев | Обзор курса | |
| Программирование на Python ПРО Перейти на сайт курса | 119 600 ₽ | - | 17 месяцев | Обзор курса |
Больше программ — в полном каталоге курсов по Python




