Глиф Учебники

Как отсортировать список в Python

Справочник · Python · 1 минута чтения

Python
nums = [5, 2, 9, 1]
nums.sort()
print(nums)
print(sorted([5, 2, 9, 1], reverse=True))
Вывод
[1, 2, 5, 9]
[9, 5, 2, 1]

Ловушка: sort возвращает None

Python
nums = [3, 1, 2]
result = nums.sort()
print(result)
print(nums)
Вывод
None
[1, 2, 3]

Запись nums = nums.sort() теряет список: в nums окажется None. Нужно либо nums.sort() отдельной строкой, либо nums = sorted(nums).

Свой порядок: key

Параметр key — функция, по результату которой сравниваются элементы:

Python
words = ["груша", "Яблоко", "киви", "апельсин"]
print(sorted(words))
print(sorted(words, key=str.lower))
print(sorted(words, key=len))
Вывод
['Яблоко', 'апельсин', 'груша', 'киви']
['апельсин', 'груша', 'киви', 'Яблоко']
['киви', 'груша', 'Яблоко', 'апельсин']

Строки сравниваются по кодам букв, поэтому все большие буквы идут раньше маленьких. key=str.lower сравнивает слова как будто в нижнем регистре, key=len — по длине. Слова одинаковой длины остаются в исходном порядке.

Буква ё

Код буквы «ё» больше, чем у «я», поэтому слова на «ё» оказываются в конце. Если важен алфавитный порядок, при сравнении «ё» заменяют на «е»:

Python
words = ["ёж", "жук", "яма", "еда"]
print(sorted(words))
print(sorted(words, key=lambda w: w.replace("ё", "е")))
Вывод
['еда', 'жук', 'яма', 'ёж']
['еда', 'ёж', 'жук', 'яма']

lambda — короткая функция в одну строку: lambda w: w.replace("ё", "е") получает слово w и возвращает его с заменённой буквой.

По второму элементу

Список пар сортируют по нужной части через lambda:

Python
students = [("Аня", 9), ("Борис", 7), ("Вика", 10)]
students.sort(key=lambda s: s[1], reverse=True)
for name, mark in students:
    print(name, mark)
Вывод
Вика 10
Аня 9
Борис 7

Без key пары сравнивались бы по первому элементу — по имени.

Словарь по значениям

Сам словарь не сортируется, но его пары можно получить по порядку:

Python
votes = {"Минск": 12, "Брест": 30, "Гомель": 21}
for city, count in sorted(votes.items(), key=lambda kv: kv[1], reverse=True):
    print(city, count)
Вывод
Брест 30
Гомель 21
Минск 12

Числа, записанные строками

Строки с цифрами сортируются как текст — по первому знаку, поэтому "100" оказывается раньше "9". Помогает key=int:

Python
values = ["10", "9", "100"]
print(sorted(values))
print(sorted(values, key=int))
Вывод
['10', '100', '9']
['9', '10', '100']

Список, где перемешаны числа и строки, отсортировать нельзя — Python выдаст ошибку TypeError со словами '<' not supported between instances of: число и строку нельзя сравнить. Сначала приведите все элементы к одному типу.