Метод sort() в Python: как отсортировать список и чем он отличается от sorted()

Чтобы отсортировать список в Python, вызовите nums.sort(): метод упорядочит элементы на месте и вернёт None.

Нужен и старый порядок, тогда берите sorted(), функция вернёт новый список.

Внутри 18 примеров с проверенным выводом: параметры key и reverse, сортировка словарей, кортежей и русских слов с буквой «ё», а ещё ошибки вроде TypeError при смешанных типах.

Статью написал:
Ваня Буявец, продюсер, основатель Checkroi
Ваня Буявец
Основатель Checkroi, продюсер, эксперт в выборе онлайн-курсов
Все 2944 статьи автора Подписаться на Телеграм-канал
Одобрено экспертом:
Наташа Буявец, основатель Checkroi, эксперт по онлайн-курсам
Наташа Буявец
Основательница Checkroi, продюсер Youtube-каналов, эксперт по онлайн-курсам
Все 3598 экспертных мнений Подписаться на Телеграм-канал
Обложка: Метод sort() в Python: как отсортировать список и чем он отличается от sorted()

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

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

CheckroiCheckroiПодборка курсов по Python566 курсов • 51 школаСравните цены, школы, программу и найдите выгодные предложения по обучениюСравнить→

Как отсортировать список методом sort()

Рой сортирует список на ноутбуке

Метод sort() есть только у списков. Он переставляет элементы на месте и ничего не возвращает, точнее, возвращает None.

  1. Создайте список: nums = [5, 2, 9, 1].
  2. Вызовите метод без аргументов: nums.sort().
  3. Выведите сам список: 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. Метод оставляем для случаев, когда старый порядок точно не понадобится.

Канал основателя Checkroi Вани Буявца3 700 человек читают мой Телеграм-канал про нейросетиСобрал промпты для Claude Code и ChatGPT, разборы ИИ-инструментов и лайфхаки по продвижению бизнеса в одном местеПрисоединиться

Сортировка по убыванию: параметр 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.

Ваня БуявецКанал основателя Checkroi Вани БуявцаЗабирайте промпты и обучение по нейросетям в моём Телеграм-каналеБольше 3 700 человек уже применяют Claude Code, ChatGPT и другие нейросети в работе, учёбе, бизнесе и жизниПерейти в канал

Устойчивость сортировки и сортировка в два прохода

Карточки, разложенные по цвету и по размеру

И метод, и функция сортируют устойчиво: документация гарантирует, что элементы с одинаковым ключом сохраняют исходный порядок относительно друг друга. Это видно уже в примере с оценками: Аня и Вика получили по пятёрке и остались в том порядке, в каком стояли.

На устойчивости основан приём «сортировка в несколько проходов». Сначала сортируете по второстепенному признаку, потом по главному. Например, сотрудников по зарплате от большей к меньшей внутри каждой должности:

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-разработчик»
Перейти на сайт курса
SkillboxSkillbox157 335 ₽5987 ₽/мес.10 месяцевОбзор курса
Fullstack-разработчик на Python
Перейти на сайт курса
НетологияНетология161 200 ₽7125 ₽/мес.21 месяцОбзор курса
ДО Профессия Python-разработчик
Перейти на сайт курса
GeekBrainsGeekBrains149 001 ₽3167 ₽/мес.10 месяцевОбзор курса
Автоматизированное тестирование на Python
Перейти на сайт курса
SkillboxSkillbox118 666 ₽4108 ₽/мес.9 месяцевОбзор курса
Программирование на Python ПРО
Перейти на сайт курса
SkillboxSkillbox119 600 ₽ - 17 месяцевОбзор курса

Больше программ — в полном каталоге курсов по Python

Часто задаваемые вопросы

Чем отличается sort() от sorted() в Python?

Метод list.sort() есть только у списков: он переставляет элементы в том же списке и возвращает None. Функция sorted() принимает любой итерируемый объект (кортеж, строку, словарь, множество) и возвращает новый список, исходные данные не меняются.

Как отсортировать список по убыванию?

Передайте параметр reverse=True: sorted(nums, reverse=True) или nums.sort(reverse=True). Параметр указывается только по имени, запись nums.sort(True) вызовет ошибку.

Почему nums.sort() возвращает None?

Метод сортирует список на месте и намеренно ничего не возвращает. Поэтому nums = nums.sort() затирает список значением None. Пишите просто nums.sort() или nums = sorted(nums).

Как отсортировать словарь по значению?

Отсортируйте пары ключ–значение: sorted(d.items(), key=lambda kv: kv[1]). Если нужен снова словарь, оберните результат в dict(), словари в Python 3.7 и новее сохраняют порядок вставки.

Как отсортировать слова по алфавиту без учёта регистра?

Используйте ключ str.lower: sorted(words, key=str.lower). Если в словах есть буква «ё», добавьте замену в ключ: key=lambda w: w.lower().replace("ё", "е"), иначе такие слова окажутся в конце списка.

Как отсортировать список по длине элементов?

Передайте в ключ функцию len: sorted(words, key=len). Слова одинаковой длины сохранят исходный порядок, потому что сортировка в Python устойчивая.

Читайте Checkroi первым в Google
Добавьте Checkroi в избранные источники — и наши разборы курсов и обзоры школ будут показываться выше в вашей выдаче Google.
Оставить комментарий
0 комментариев
Форма комментария

Оставьте комментарий

Напишите, что думаете. Нам важно ваше мнение!