Функция 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()

Функция принимает строку.

Внутри функции нужно:

  1. получить символы от меньшего к большему;
  2. получить символы от большего к меньшему;
  3. вернуть f-строку с результатами.

Пример вызова:

print(create_letters_report('Python'))

Пример результата:

Исходная строка: Python
По возрастанию: ['P', 'h', 'n', 'o', 't', 'y']
По убыванию: ['y', 't', 'o', 'n', 'h', 'P']