Функция sorted() в Python¶
sorted() — встроенная функция языка программирования Python, которая возвращает новый отсортированный список из элементов любого итерируемого объекта (iterable). Функция гарантированно создаёт новый список, не изменяя исходный объект, и используется для упорядочивания последовательностей по возрастанию или убыванию, а также по заданному пользовательскому правилу.
¶Синтаксис и параметры
Функция имеет следующую сигнатуру:
``python sorted(iterable, *, key=None, reverse=False) ``
Параметры функции:
- iterable — обязательный аргумент; любой итерируемый объект: список, кортеж, строка, множество, словарь (при передаче словаря сортируются его ключи), а также генераторы и файловые объекты.
- key — необязательный аргумент; функция одного аргумента, которая применяется к каждому элементу перед сравнением. Результат этой функции используется для определения порядка, при этом исходные элементы остаются неизменными.
- reverse — необязательный аргумент; булево значение. При значении
Trueсортировка выполняется в порядке убывания (по убыванию значений ключа). По умолчанию равноFalse(сортировка по возрастанию).
Звёздочка * в сигнатуре означает, что параметры key и reverse должны передаваться только как именованные (keyword arguments). Попытка передать их позиционно приведёт к ошибке TypeError.
¶Принцип работы
Функция sorted() реализует устойчивую (stable) сортировку: если два элемента имеют равные ключи, их относительный порядок в исходной последовательности сохраняется в отсортированном результате. Это свойство позволяет выполнять многоуровневую сортировку, последовательно применяя функцию с разными ключами.
Для сортировки используется алгоритм Timsort — гибридный алгоритм, созданный Тимом Петерсом в 2002 году для языка Python. Timsort сочетает сортировку вставками и сортировку слиянием, достигая временной сложности O(n log n) в худшем случае и O(n) на частично отсортированных данных. Алгоритм был внедрён в Python начиная с версии 2.3 и впоследствии заимствован другими языками, включая Java (для сортировки массивов объектов) и JavaScript (движок V8).
¶Отличие от метода sort()
В Python существует два основных способа сортировки: функция sorted() и метод списка list.sort(). Ключевые различия:
- sorted() работает с любым итерируемым объектом и возвращает новый список; исходный объект не изменяется.
- list.sort() существует только у списков, выполняет сортировку «на месте» (in-place), изменяя исходный список, и возвращает
None.
Выбор между ними зависит от задачи: если необходимо сохранить исходный объект или отсортировать не список (например, кортеж или множество), используется sorted(). Если требуется отсортировать список без создания копии (для экономии памяти), применяется list.sort().
```python numbers = [3, 1, 2] sorted_numbers = sorted(numbers) # [1, 2, 3] print(numbers) # [3, 1, 2] — исходный список не изменён
numbers.sort() # сортировка на месте print(numbers) # [1, 2, 3] ```
¶Примеры использования
¶Базовая сортировка
``python print(sorted([5, 2, 9, 1])) # [1, 2, 5, 9] print(sorted("python")) # ['h', 'n', 'o', 'p', 't', 'y'] — символы в лексикографическом порядке print(sorted((3, 1, 2))) # [1, 2, 3] — кортеж преобразуется в список ``
¶Сортировка по убыванию
``python print(sorted([5, 2, 9, 1], reverse=True)) # [9, 5, 2, 1] ``
¶Параметр key
Параметр key позволяет задать произвольное правило сравнения. Функция, переданная в key, вызывается для каждого элемента ровно один раз, что делает сортировку эффективной даже для больших данных.
```python words = ["banana", "apple", "cherry"] print(sorted(words, key=len)) # ['apple', 'banana', 'cherry'] — по длине строки
students = [ {"name": "Иван", "grade": 4}, {"name": "Мария", "grade": 5}, {"name": "Пётр", "grade": 3} ] print(sorted(students, key=lambda s: s["grade"]))
¶[{'name': 'Пётр', 'grade': 3}, {'name': 'Иван', 'grade': 4}, {'name': 'Мария', 'grade': 5}]
```
¶Сортировка словаря
При передаче словаря функция sorted() сортирует его ключи:
``python ages = {"Иван": 30, "Мария": 25, "Пётр": 35} print(sorted(ages)) # ['Иван', 'Мария', 'Пётр'] — ключи в алфавитном порядке print(sorted(ages.items())) # сортировка пар (ключ, значение) по ключу ``
Для сортировки словаря по значениям используется параметр key с обращением ко второму элементу пары:
```python sorted(ages.items(), key=lambda item: item[1])
¶[('Мария', 25), ('Иван', 30), ('Пётр', 35)]
```
¶Сортировка объектов пользовательских классов
Функция работает с любыми объектами, поддерживающими операторы сравнения. Для пользовательских классов можно определить методы __lt__ (меньше) или использовать параметр key для извлечения сравнимого атрибута:
```python class Person: def __init__(self, name, age): self.name = name self.age = age
people = [Person("Иван", 30), Person("Мария", 25), Person("Пётр", 35)] sorted_people = sorted(people, key=lambda p: p.age) ```
¶Сортировка с несколькими критериями
Благодаря устойчивости сортировки, для упорядочивания по нескольким полям можно применить функцию последовательно: сначала по менее важному критерию, затем по более важному. Альтернативный способ — использовать кортеж в качестве ключа:
```python data = [("Иван", 25), ("Мария", 25), ("Пётр", 30)]
¶Сортировка по возрасту, затем по имени (в пределах равного возраста)
print(sorted(data, key=lambda x: (x[1], x[0])))
¶[('Иван', 25), ('Мария', 25), ('Пётр', 30)]
```
Для сортировки по убыванию одного из критериев и по возрастанию другого применяется приём с отрицанием числовых значений или использование модуля functools и функции cmp_to_key.
¶Особенности и ограничения
- Функция
sorted()требует, чтобы элементы были сравнимы между собой. Смешение типов (например, целых чисел и строк) вызовет ошибкуTypeErrorпри попытке сравнения. - Для строк сортировка выполняется по кодам символов Unicode (лексикографический порядок). При этом заглавные буквы располагаются раньше строчных, что может давать неожиданные результаты для текстов на русском языке. Для корректной сортировки по алфавиту с учётом регистра используется
key=str.lower. - В Python 3 функция
sorted()не поддерживает аргументcmp(функцию сравнения), который существовал в Python 2. Вместо него применяется параметрkeyлибоfunctools.cmp_to_key. - При сортировке больших объёмов данных параметр
keyследует предпочитать созданию новых списков с преобразованными элементами, поскольку результатkeyвычисляется один раз и кэшируется.
¶Производительность
Временная сложность алгоритма Timsort составляет O(n log n) в среднем и худшем случаях. Для уже отсортированных или частично отсортированных данных алгоритм работает значительно быстрее, приближаясь к линейной сложности O(n). Пространственная сложность составляет O(n) в худшем случае из-за необходимости хранения временных массивов при слиянии.
¶Применение
Функция sorted() широко используется в задачах обработки данных, при работе с коллекциями, в алгоритмах машинного обучения, при подготовке отчётов и в любых сценариях, требующих упорядочивания информации. Она входит в число наиболее часто используемых встроенных функций Python наряду с len(), range() и enumerate().