
Работа с кортежами часто требует сортировки по одному или нескольким элементам. Например, при обработке данных о пользователях, где кортежи содержат имя и возраст, важно получить упорядоченный список по возрасту или по алфавиту. В Python это выполняется встроенными средствами без необходимости писать собственные алгоритмы сортировки.
Ключевым инструментом является функция sorted(), которая возвращает новый список, а также метод list.sort(), изменяющий исходный объект. Оба варианта позволяют задать параметр key для выбора элемента кортежа, по которому будет происходить сравнение. Дополнительно можно использовать аргумент reverse=True для получения убывающей последовательности.
Сложные структуры с несколькими критериями сортировки решаются с помощью передачи в key функции lambda или готовой утилиты operator.itemgetter(). Это позволяет, например, сначала отсортировать по второму элементу кортежа, а при равенстве значений – по первому. Такой подход делает работу с данными предсказуемой и управляемой.
Сортировка списка кортежей по первому элементу
Для сортировки по первому элементу используется встроенная функция sorted() или метод list.sort() с параметром key. В качестве ключа достаточно указать lambda x: x[0].
Пример:
data = [(3, 'c'), (1, 'a'), (2, 'b')]
result = sorted(data, key=lambda x: x[0])
print(result) # [(1, 'a'), (2, 'b'), (3, 'c')]
Для обратного порядка добавьте параметр reverse=True:
result = sorted(data, key=lambda x: x[0], reverse=True)
print(result) # [(3, 'c'), (2, 'b'), (1, 'a')]
Если список очень большой, предпочтительнее использовать list.sort(), так как он выполняет сортировку на месте и не создает копию:
data.sort(key=lambda x: x[0])
Таким способом можно надежно упорядочить кортежи по значению первого элемента независимо от их длины.
Сортировка по последнему элементу кортежа
Для сортировки по последнему элементу используется функция sorted() с параметром key. В качестве ключа удобно применять лямбда-выражение.
data = [(3, 7), (1, 4), (2, 9), (5, 2)]
result = sorted(data, key=lambda x: x[-1])
print(result) # [(5, 2), (1, 4), (3, 7), (2, 9)]
Если требуется обратный порядок:
result = sorted(data, key=lambda x: x[-1], reverse=True)
print(result) # [(2, 9), (3, 7), (1, 4), (5, 2)]
Практические рекомендации:
- Используйте
x[-1], чтобы не зависеть от длины кортежа. - При одинаковых последних элементах сортировка будет учитывать предыдущие элементы автоматически.
- Для больших списков учитывайте, что сложность алгоритма
O(n log n).
Использование параметра key с функцией lambda

Функция sorted() и метод list.sort() принимают параметр key, позволяющий задать правило сортировки. Для этого удобно использовать lambda, которая возвращает элемент, по которому выполняется сравнение.
Например, сортировка списка кортежей по первому элементу:
data = [(3, 'c'), (1, 'a'), (2, 'b')]
result = sorted(data, key=lambda x: x[0])
# [(1, 'a'), (2, 'b'), (3, 'c')]
По второму элементу:
data = [(3, 'c'), (1, 'a'), (2, 'b')]
result = sorted(data, key=lambda x: x[1])
# [(1, 'a'), (2, 'b'), (3, 'c')]
Если требуется сортировка по нескольким критериям, можно вернуть кортеж:
data = [(1, 3), (1, 2), (2, 1)]
result = sorted(data, key=lambda x: (x[0], x[1]))
# [(1, 2), (1, 3), (2, 1)]
Использование lambda делает код компактным и позволяет гибко управлять порядком сортировки без написания дополнительных функций.
Сортировка по нескольким полям одновременно
В Python функция sorted() и метод list.sort() поддерживают передачу ключа в виде функции, возвращающей кортеж. Порядок элементов в этом кортеже определяет приоритет сортировки: сначала сравнивается первый элемент, при равенстве – второй и так далее.
Пример: список сотрудников представлен кортежами вида (фамилия, имя, возраст). Чтобы сначала отсортировать по фамилии, а внутри одинаковых фамилий – по возрасту:
data = [
("Иванов", "Петр", 30),
("Сидоров", "Алексей", 25),
("Иванов", "Алексей", 22),
("Петров", "Иван", 30)
]
result = sorted(data, key=lambda x: (x[0], x[2]))
print(result)
Если требуется обратный порядок только по одному полю, используют преобразование значения. Например, сортировка по фамилии по возрастанию и по возрасту по убыванию:
result = sorted(data, key=lambda x: (x[0], -x[2]))
Такой подход избавляет от необходимости многократно вызывать сортировку и обеспечивает стабильный результат при большом объёме данных.
Применение оператора itemgetter для сортировки
Модуль operator предоставляет функцию itemgetter, которая позволяет получать элементы кортежей по индексам и использовать их как ключ сортировки. Такой подход работает быстрее, чем лямбда-функции, особенно при обработке больших списков.
Пример сортировки по первому элементу каждого кортежа:
from operator import itemgetter
data = [(3, 'c'), (1, 'a'), (2, 'b')]
result = sorted(data, key=itemgetter(0))
print(result) # [(1, 'a'), (2, 'b'), (3, 'c')]
Для сортировки по нескольким полям можно передать несколько индексов:
data = [(1, 'c'), (1, 'a'), (2, 'b')]
result = sorted(data, key=itemgetter(0, 1))
print(result) # [(1, 'a'), (1, 'c'), (2, 'b')]
При частом использовании сортировки itemgetter предпочтителен за счёт читаемости и производительности. Он хорошо подходит для работы с данными в формате списков кортежей, где требуется гибкая сортировка по разным позициям.
Обратная сортировка списка кортежей
Для сортировки списка кортежей в обратном порядке используется параметр reverse=True функции sorted() или метода list.sort(). Это меняет направление сортировки с возрастающего на убывающее.
Пример с sorted():
data = [(3, 'яблоко'), (1, 'банан'), (2, 'вишня')]
sorted_data = sorted(data, reverse=True)
print(sorted_data) # [(3, 'яблоко'), (2, 'вишня'), (1, 'банан')]
Если требуется сортировать по конкретному элементу кортежа, используют параметр key. Например, по второму элементу:
data = [(3, 'яблоко'), (1, 'банан'), (2, 'вишня')]
sorted_data = sorted(data, key=lambda x: x[1], reverse=True)
print(sorted_data) # [(3, 'яблоко'), (2, 'вишня'), (1, 'банан')]
Метод list.sort() изменяет исходный список без создания нового объекта. Пример:
data = [(3, 'яблоко'), (1, 'банан'), (2, 'вишня')]
data.sort(reverse=True)
print(data) # [(3, 'яблоко'), (2, 'вишня'), (1, 'банан')]
При работе с большим массивом данных list.sort() предпочтительнее, так как выполняется на месте и экономит память.
Для сортировки по нескольким критериям используют кортежи ключей: key=lambda x: (x[0], x[1]) с reverse=True, чтобы все уровни сортировки учитывали обратный порядок.
Вопрос-ответ:
Как отсортировать список кортежей по первому элементу каждого кортежа?
В Python для сортировки списка кортежей можно использовать функцию sorted() или метод list.sort(). Если сортировать по первому элементу, можно просто вызвать sorted(my_list), так как по умолчанию сортировка учитывает первый элемент кортежа. Например, sorted([(3, 'a'), (1, 'b'), (2, 'c')]) вернёт [(1, 'b'), (2, 'c'), (3, 'a')].
Можно ли сортировать список кортежей по нескольким элементам одновременно?
Да, для этого удобно использовать параметр key функции sorted(). Например, sorted(my_list, key=lambda x: (x[0], x[1])) сначала отсортирует по первому элементу кортежа, а если они равны, — по второму. Такой подход позволяет контролировать порядок по нескольким уровням.
Как отсортировать список кортежей в обратном порядке?
Можно использовать параметр reverse=True в sorted() или list.sort(). Например, sorted(my_list, reverse=True) отсортирует список по убыванию первого элемента кортежа. Если нужна сортировка по другому элементу, можно сочетать key с reverse: sorted(my_list, key=lambda x: x[1], reverse=True).
Можно ли сортировать список кортежей с разными типами данных в одном кортеже?
Сортировка сложнее, если элементы кортежа разных типов, например, строки и числа. Python не может напрямую сравнивать разные типы. Решение — использовать key и преобразовать элементы к одному типу, например: sorted(my_list, key=lambda x: str(x[0])). Это позволяет определить свой критерий сравнения и избежать ошибок.
Что быстрее: метод list.sort() или функция sorted() для списков кортежей?
list.sort() изменяет сам список на месте и обычно работает быстрее, так как не создаёт копию списка. sorted() создаёт новый список и оставляет исходный без изменений. Если не требуется сохранять исходный список, лучше использовать list.sort(); если нужна новая отсортированная версия, подходит sorted().
