List.sort: примеры (PYTHON)
list.sort(key, reverse): NoneОсновные сведения о методе list.sort
Метод list.sort() предназначен для сортировки элементов списка непосредственно в том же объекте, без создания нового списка. Этот подход называется сортировкой на месте. Метод используется, когда требуется упорядочить элементы последовательности согласно определенным критериям.
Поддерживаемые параметры:
- key: необязательный аргумент, функция с одним аргументом, которая вычисляет значение для сравнения каждого элемента. По умолчанию имеет значение
None. - reverse: необязательный булевый аргумент. Если установлено значение
True, элементы сортируются в порядке убывания. По умолчаниюFalse.
Возвращаемое значение: метод sort() ничего не возвращает (фактически None), так как изменяет исходный список.
Примеры базового применения
Сортировка списка чисел в естественном порядке:
numbers = [3, 1, 4, 1, 5, 9, 2]
numbers.sort()
print(numbers)[1, 1, 2, 3, 4, 5, 9]
Сортировка строк в обратном алфавитном порядке:
words = ['яблоко', 'банан', 'вишня']
words.sort(reverse=True)
print(words)['яблоко', 'вишня', 'банан']
Сортировка по длине строк с использованием параметра key:
fruits = ['яблоко', 'киви', 'арбуз']
fruits.sort(key=len)
print(fruits)['киви', 'арбуз', 'яблоко']
Сортировка списка кортежей по второму элементу:
pairs = [(1, 'один'), (3, 'три'), (2, 'два')]
pairs.sort(key=lambda x: x[1])
print(pairs)[(1, 'один'), (2, 'два'), (3, 'три')]
Альтернативные функции в Python
Встроенная функция sorted() создает новый отсортированный список из итерируемого объекта, не изменяя оригинал. Функция sorted() принимает те же аргументы key и reverse. Предпочтительнее использовать sorted(), когда необходимо сохранить исходный порядок элементов.
Для сложных структур данных иногда применяется модуль operator с функциями itemgetter(), attrgetter() и methodcaller(), которые могут быть более эффективными и читаемыми, чем lambda-функции для параметра key.
Реализации в других языках
В JavaScript массивы имеют метод sort(), который по умолчанию сортирует элементы как строки. Для числовой сортировки требуется передать функцию сравнения.
let arr = [40, 1, 5, 200];
arr.sort((a, b) => a - b);
console.log(arr);[1, 5, 40, 200]
В Java для сортировки массивов используется Arrays.sort(), а для списков - Collections.sort(). В Java 8+ можно использовать лямбда-выражения.
import java.util.Arrays;
int[] arr = {5, 2, 8};
Arrays.sort(arr);
System.out.println(Arrays.toString(arr));[2, 5, 8]
В языке Go сортировка осуществляется через пакет sort, который требует реализации интерфейсов для пользовательских типов. Для срезов примитивных типов существуют готовые функции.
import "sort"
ints := []int{4, 2, 3}
sort.Ints(ints)
fmt.Println(ints)[2, 3, 4]
Распространенные ошибки
Попытка сортировки списка с несовместимыми для сравнения типами данных вызывает исключение TypeError.
mixed = [1, 'два', 3]
mixed.sort()TypeError: '<' not supported between instances of 'str' and 'int'
Ожидание возврата нового списка может привести к неожиданному результату, так как метод sort() возвращает None.
numbers = [3, 1, 2]
sorted_list = numbers.sort()
print(sorted_list)None
Использование изменяемого объекта в качестве ключа сортировки может вызвать непредсказуемое поведение, если этот объект изменяется в процессе.
История изменений
В Python 3.4 был добавлен аргумент key для метода list.sort(). Ранее он уже поддерживался функцией sorted().
Начиная с Python 3.7, гарантируется, что сортировка стабильна. Это означает, что порядок элементов, которые сравниваются как равные, сохраняется. Такое поведение было деталью реализации с версии Python 2.2.
Расширенные примеры использования
Сортировка сложных объектов по нескольким атрибутам с использованием кортежей в функции key:
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __repr__(self):
return f'{self.name}:{self.age}'
people = [Person('Иван', 25), Person('Анна', 25), Person('Иван', 20)]
people.sort(key=lambda p: (p.name, p.age))
print(people)[Анна:25, Иван:20, Иван:25]
Сортировка с использованием функции из модуля operator для повышения производительности:
from operator import attrgetter
people.sort(key=attrgetter('name', 'age'))
print(people)[Анна:25, Иван:20, Иван:25]
Сортировка списка строк без учета регистра:
words = ['Яблоко', 'арбуз', 'Банан']
words.sort(key=str.lower)
print(words)['арбуз', 'Банан', 'Яблоко']
Сортировка по убыванию абсолютного значения:
numbers = [-5, 3, -1, 2]
numbers.sort(key=abs, reverse=True)
print(numbers)[-5, 3, 2, -1]