Функция sorted() в Python
Обновлено:
1. Функция sorted()
В Python существует встроенная функция:
sorted()
Она позволяет отсортировать элементы итерируемого объекта.
На данный момент мы знаем три подходящих итерируемых типа:
str
list
tuple
По умолчанию sorted() сортирует элементы от меньшего к большему.
2. Сортировка списка чисел
numbers = [7, 2, 10, 3, 5]
result = sorted(numbers)
print(result)
Результат:
[2, 3, 5, 7, 10]
Числа расположились от меньшего к большему.
3. sorted() создаёт новый список
Функция sorted() не изменяет переданный список.
numbers = [7, 2, 10, 3, 5]
result = sorted(numbers)
print(numbers)
print(result)
Результат:
[7, 2, 10, 3, 5]
[2, 3, 5, 7, 10]
Исходный объект numbers остался без изменений.
Функция создала новый объект класса list.
Можно проверить:
print(type(result))
Результат:
<class 'list'>
4. Даже список превращается в новый список
Передадим уже отсортированный список:
numbers = [1, 2, 3]
result = sorted(numbers)
print(numbers == result)
print(id(numbers) == id(result))
Результат:
True
False
Значения списков равны, но это разные объекты.
То есть sorted() всегда создаёт новый список.
5. Сортировка кортежа
numbers = (15, 3, 8, 1, 20)
result = sorted(numbers)
print(result)
Результат:
[1, 3, 8, 15, 20]
Обратите внимание:
в функцию передали:
tuple
а получили:
list
Проверим:
print(type(result))
Результат:
<class 'list'>
6. Сортировка строки
Строка тоже является итерируемым объектом.
word = 'python'
result = sorted(word)
print(result)
Результат:
['h', 'n', 'o', 'p', 't', 'y']
Python перебрал символы строки и расположил их по возрастанию.
Результатом снова стал список.
7. Почему буквы сортируются именно так
Мы уже знаем, что строки сравниваются по кодам Unicode.
Например:
ord('A')
возвращает:
65
А:
ord('a')
возвращает:
97
Поэтому:
sorted('aAbB')
даст:
['A', 'B', 'a', 'b']
Сначала идут символы с меньшими кодами Unicode.
8. Сортировка списка строк
fruits = [
'Kiwi',
'Apple',
'Orange',
'Banana',
]
result = sorted(fruits)
print(result)
Результат:
['Apple', 'Banana', 'Kiwi', 'Orange']
Строки сравниваются так же, как мы разбирали на предыдущих уроках:
- сначала первый символ;
- затем второй;
- затем следующий;
- до первого различающегося символа.
9. Регистр имеет значение
words = [
'python',
'Java',
'apple',
'Banana',
]
print(sorted(words))
Результат:
['Banana', 'Java', 'apple', 'python']
Большие латинские буквы имеют меньшие коды Unicode, чем маленькие.
Поэтому сортировка не обязательно будет выглядеть как привычная человеку алфавитная сортировка без учёта регистра.
Обратная сортировка
10. Аргумент reverse
По умолчанию:
sorted(numbers)
сортирует от меньшего к большему.
Чтобы изменить направление, используется необязательный именованный аргумент:
reverse=True
Пример:
numbers = [7, 2, 10, 3, 5]
result = sorted(numbers, reverse=True)
print(result)
Результат:
[10, 7, 5, 3, 2]
Теперь элементы расположены от большего к меньшему.
Важно: reverse передаётся по имени:
reverse=True
11. reverse=False
По умолчанию используется:
reverse=False
Поэтому эти две записи дают одинаковый результат:
sorted(numbers)
и:
sorted(numbers, reverse=False)
То есть:
reverse=False → от меньшего к большему
reverse=True → от большего к меньшему
12. Обратная сортировка строк
fruits = [
'Kiwi',
'Apple',
'Orange',
'Banana',
]
result = sorted(fruits, reverse=True)
print(result)
Результат:
['Orange', 'Kiwi', 'Banana', 'Apple']
13. Обратная сортировка символов строки
word = 'python'
result = sorted(word, reverse=True)
print(result)
Результат:
['y', 't', 'p', 'o', 'n', 'h']
И снова результатом является список.
14. Основные правила
Функция:
sorted()
принимает итерируемый объект и возвращает отсортированные элементы.
На этом этапе мы используем:
str
list
tuple
По умолчанию сортировка идёт:
от меньшего к большему
Пример:
sorted([5, 2, 8])
Результат:
[2, 5, 8]
Обратная сортировка:
sorted([5, 2, 8], reverse=True)
Результат:
[8, 5, 2]
sorted() всегда возвращает новый список:
type(sorted('Python'))
type(sorted((5, 2, 8)))
type(sorted([5, 2, 8]))
Во всех случаях:
<class 'list'>
Исходный объект функция sorted() не изменяет.
Домашнее задание
Задание 1. Сортировка чисел
Создать функцию:
sort_numbers()
Функция принимает список или кортеж чисел и возвращает новый список с числами от меньшего к большему.
Примеры:
print(sort_numbers([8, 2, 15, 4, 1]))
print(sort_numbers((25, 10, 50, 5)))
Ожидаемый результат:
[1, 2, 4, 8, 15]
[5, 10, 25, 50]
Задание 2. Обратная сортировка
Создать функцию:
sort_descending()
Функция принимает список чисел и возвращает новый список с числами от большего к меньшему.
Обязательно использовать:
sorted()
и:
reverse=True
Пример:
print(sort_descending([7, 12, 3, 25, 1]))
Результат:
[25, 12, 7, 3, 1]
Задание 3. Сортировка букв
Создать функцию:
create_letters_report()
Функция принимает строку.
Внутри функции нужно:
- получить символы от меньшего к большему;
- получить символы от большего к меньшему;
- вернуть f-строку с результатами.
Пример вызова:
print(create_letters_report('Python'))
Пример результата:
Исходная строка: Python
По возрастанию: ['P', 'h', 'n', 'o', 't', 'y']
По убыванию: ['y', 't', 'o', 'n', 'h', 'P']