Как отсортировать список в 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]a.sort()сортирует сам список и ничего не возвращает;sorted(a)возвращает новый отсортированный список, исходный не меняется. Он работает и со строкой, множеством, ключами словаря;reverse=True— по убыванию.
Ловушка: sort возвращает None
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 — функция, по результату которой сравниваются элементы:
words = ["груша", "Яблоко", "киви", "апельсин"]
print(sorted(words))
print(sorted(words, key=str.lower))
print(sorted(words, key=len))['Яблоко', 'апельсин', 'груша', 'киви']
['апельсин', 'груша', 'киви', 'Яблоко']
['киви', 'груша', 'Яблоко', 'апельсин']Строки сравниваются по кодам букв, поэтому все большие буквы идут раньше маленьких. key=str.lower сравнивает слова как будто в нижнем регистре, key=len — по длине. Слова одинаковой длины остаются в исходном порядке.
Буква ё
Код буквы «ё» больше, чем у «я», поэтому слова на «ё» оказываются в конце. Если важен алфавитный порядок, при сравнении «ё» заменяют на «е»:
words = ["ёж", "жук", "яма", "еда"]
print(sorted(words))
print(sorted(words, key=lambda w: w.replace("ё", "е")))['еда', 'жук', 'яма', 'ёж']
['еда', 'ёж', 'жук', 'яма']lambda — короткая функция в одну строку: lambda w: w.replace("ё", "е") получает слово w и возвращает его с заменённой буквой.
По второму элементу
Список пар сортируют по нужной части через lambda:
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 пары сравнивались бы по первому элементу — по имени.
Словарь по значениям
Сам словарь не сортируется, но его пары можно получить по порядку:
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:
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: число и строку нельзя сравнить. Сначала приведите все элементы к одному типу.