Sorted: примеры (PYTHON)

Сортировка данных с помощью функции sorted в Python
Раздел: Встроенные функции, Сортировка
sorted(iterable, key, reverse): list

Основы функции sorted в Python

Функция sorted возвращает новый отсортированный список из элементов итерируемого объекта. Она применяется, когда требуется упорядочить элементы последовательности без изменения исходной коллекции. Эта функция является встроенной и доступна всегда.

Аргументы функции:

  • iterable - обязательный аргумент, любой итерируемый объект (список, кортеж, строка, множество, словарь, генератор).
  • key - необязательный аргумент, функция, принимающая один аргумент и возвращающая ключ для сортировки. По умолчанию None, что означает прямое сравнение элементов.
  • reverse - необязательный аргумент, логическое значение. Если True, элементы сортируются в обратном (убывающем) порядке. По умолчанию False.

Возвращаемое значение:

Функция всегда возвращает новый список, содержащий все элементы исходного итерируемого объекта в отсортированном порядке. Исходная коллекция остается неизменной. Сортировка является стабильной: относительный порядок элементов с одинаковыми ключами сохраняется.

Примеры использования sorted

Сортировка списка чисел:

numbers = [5, 2, 9, 1]
result = sorted(numbers)
print(result)
[1, 2, 5, 9]

Сортировка строк в обратном порядке:

words = ['яблоко', 'банан', 'апельсин']
result = sorted(words, reverse=True)
print(result)
['яблоко', 'банан', 'апельсин']

Сортировка по длине строки с использованием key:

words = ['яблоко', 'банан', 'апельсин']
result = sorted(words, key=len)
print(result)
['банан', 'яблоко', 'апельсин']

Сортировка списка кортежей по второму элементу:

data = [('Анна', 25), ('Иван', 20), ('Мария', 30)]
result = sorted(data, key=lambda x: x[1])
print(result)
[('Иван', 20), ('Анна', 25), ('Мария', 30)]

Сортировка словаря по значениям:

dictionary = {'a': 3, 'b': 1, 'c': 2}
result = sorted(dictionary.items(), key=lambda item: item[1])
print(result)
[('b', 1), ('c', 2), ('a', 3)]

Похожие функции в Python

Метод list.sort() сортирует список на месте и не возвращает новый список. Его применяют, когда исходный список нужно изменить. Метод доступен только для списков.

Функция heapq.nsmallest() и heapq.nlargest() из модуля heapq эффективно находят несколько наименьших или наибольших элементов в коллекции. Их использование предпочтительно при работе с очень большими последовательностями, когда не требуется полная сортировка.

Функция min() и max() возвращают один минимальный или максимальный элемент. Их применяют, когда нужен только крайний элемент, а не весь отсортированный набор.

Встроенная функция reversed() возвращает обратный итератор. Ее используют для получения элементов в обратном порядке без сортировки по значению.

Аналоги функции в других языках

В PHP функция sort() сортирует массив по значению, изменяя исходный массив. Для сохранения ключей применяют asort().

$arr = [5, 2, 9, 1];
sort($arr);
print_r($arr);
Array
(
    [0] => 1
    [1] => 2
    [2] => 5
    [3] => 9
)

В JavaScript метод массива sort() выполняет сортировку на месте. Для сортировки чисел требуется передать функцию сравнения.

let arr = [5, 2, 9, 1];
arr.sort((a, b) => a - b);
console.log(arr);
[1, 2, 5, 9]

В Java для сортировки массивов используют Arrays.sort(), для коллекций - Collections.sort(). Эти методы изменяют исходный объект.

import java.util.Arrays;
int[] arr = {5, 2, 9, 1};
Arrays.sort(arr);
System.out.println(Arrays.toString(arr));
[1, 2, 5, 9]

В SQL предложение ORDER BY сортирует результаты запроса. Сортировка происходит на стороне базы данных.

SELECT name, age FROM users ORDER BY age DESC;

В C# метод Array.Sort() сортирует массив на месте, а Enumerable.OrderBy() из LINQ возвращает новую отсортированную последовательность.

int[] arr = { 5, 2, 9, 1 };
Array.Sort(arr);
Console.WriteLine(string.Join(", ", arr));
1, 2, 5, 9

В Lua таблицы не имеют встроенной функции сортировки, но есть функция table.sort(), которая сортирует список на месте.

local tbl = {5, 2, 9, 1}
table.sort(tbl)
print(table.concat(tbl, ", "))
1, 2, 5, 9

В Go для сортировки срезов используют функции из пакета sort, например, sort.Ints(). Сортировка происходит на месте.

package main
import (
    "fmt"
    "sort"
)
func main() {
    nums := []int{5, 2, 9, 1}
    sort.Ints(nums)
    fmt.Println(nums)
}
[1 2 5 9]

В Kotlin функция sorted() возвращает новый отсортированный список, аналогично Python. Метод sort() сортирует изменяемую коллекцию на месте.

val list = listOf(5, 2, 9, 1)
val result = list.sorted()
println(result)
[1, 2, 5, 9]

Типичные ошибки при работе с sorted

Попытка отсортировать объекты разных типов, которые не поддерживают сравнение между собой, вызывает исключение TypeError.

mixed = [1, 'два', 3.0]
result = sorted(mixed)
TypeError: '<' not supported between instances of 'str' and 'int'

Использование функции key, которая не возвращает значение для некоторых элементов, может привести к ошибкам.

data = [1, 2, None, 4]
result = sorted(data, key=lambda x: x*2)
TypeError: unsupported operand type(s) for *: 'NoneType' and 'int'

Ожидание, что sorted вернет исходный тип, хотя функция всегда возвращает список.

tup = (3, 1, 2)
result = sorted(tup)
print(type(result))

Передача неитерируемого объекта в качестве аргумента вызывает TypeError.

result = sorted(123)
TypeError: 'int' object is not iterable

Изменения в последних версиях Python

В Python 3.10 не было внесено значительных изменений в поведение функции sorted. Однако, начиная с Python 3.7, для словарей гарантируется порядок вставки, что влияет на результат сортировки словаря, если итерировать его напрямую. В более ранних версиях порядок элементов словаря был неопределенным.

В Python 3 был удален аргумент cmp, который присутствовал в Python 2. Функция сравнения теперь реализуется через аргумент key или используется модуль functools.cmp_to_key для преобразования.

Расширенные примеры применения sorted

Сортировка сложных объектов по нескольким критериям с помощью кортежа в key:

Пример python
class Product:
    def __init__(self, name, price, weight):
        self.name = name
        self.price = price
        self.weight = weight
    def __repr__(self):
        return f"{self.name}: {self.price} руб., {self.weight} кг"

products = [
    Product('Яблоки', 100, 1.5),
    Product('Груши', 120, 1.0),
    Product('Яблоки', 90, 2.0)
]
# Сортировка по имени, затем по цене
sorted_products = sorted(products, key=lambda p: (p.name, p.price))
for p in sorted_products:
    print(p)
Груши: 120 руб., 1.0 кг
Яблоки: 90 руб., 2.0 кг
Яблоки: 100 руб., 1.5 кг

Использование модуля operator для указания ключей сортировки:

Пример python
from operator import itemgetter, attrgetter
data = [('Анна', 25), ('Иван', 20), ('Мария', 30)]
# Сортировка по второму элементу кортежа
result = sorted(data, key=itemgetter(1))
print(result)

# Для объектов
sorted_products = sorted(products, key=attrgetter('price'))
for p in sorted_products:
    print(p.name, p.price)
[('Иван', 20), ('Анна', 25), ('Мария', 30)]
Яблоки 90
Яблоки 100
Груши 120

Сортировка с учетом локали для строк:

Пример python
import locale
locale.setlocale(locale.LC_COLLATE, 'ru_RU.UTF-8')
words = ['ёж', 'яблоко', 'азбука', 'арбуз']
sorted_words = sorted(words, key=locale.strxfrm)
print(sorted_words)
['азбука', 'арбуз', 'яблоко', 'ёж']

Сортировка по убыванию абсолютного значения:

Пример python
numbers = [-5, 2, -9, 1, -2]
result = sorted(numbers, key=abs, reverse=True)
print(result)
[-9, -5, 2, -2, 1]

Стабильность сортировки позволяет выполнять несколько сортировок подряд:

Пример python
data = [
    ('Москва', 'город'),
    ('Сочи', 'город'),
    ('Волга', 'река'),
    ('Москва', 'река')
]
# Сначала сортировка по типу, затем по названию
result = sorted(data, key=lambda x: x[0])
result = sorted(result, key=lambda x: x[1])
print(result)
[('Москва', 'город'), ('Сочи', 'город'), ('Волга', 'река'), ('Москва', 'река')]

Сортировка с использованием пользовательского класса, реализующего __lt__:

Пример python
class CustomNumber:
    def __init__(self, value):
        self.value = value
    def __lt__(self, other):
        # Сравниваем по последней цифре
        return self.value % 10 < other.value % 10
    def __repr__(self):
        return str(self.value)

numbers = [CustomNumber(15), CustomNumber(22), CustomNumber(33)]
result = sorted(numbers)
print(result)
[22, 33, 15]

питон sorted function comments

En
Sorted Return sorted list from iterable