
Шаг 8. Сортировка коллекций
Баллов за прохождение: 1
Сортировка коллекций
Сортировка коллекций часто может понадобиться в решаемых задачах. Например, отсортировать список пользователей по алфавиту, или, наоборот, вывести его в обратном порядке. На этом уроке мы рассмотрим основные методы сортировки.
Функция sorted()
В Python существует встроенная функция, позволяющую вывести список сортированных элементов, не изменяя исходную коллекцию.
my_list = ['b', 'a', 'd', 'c']
my_list = sorted(my_list)
print(my_list) # ['a', 'b', 'c', 'd']
Так как данная функция не изменяет исходную коллекцию, мы можем применить ее к неизменяемым коллекциям
my_tuple = (1, 3, 4, 2, 5)
my_tuple = sorted(my_tuple)
print(my_tuple) # [1, 2, 3, 4, 5], sorted() всегда возвращает список
В сортировке возвращаемых элементов не имеет значения, был ли у элемента индекс в изначальной коллекции, поэтому мы можем применить sorted() и к неиндексируемым коллекциям
my_set = {2, 4, 1, 5 ,3}
my_set = sorted(my_set)
print(my_set) # [1, 2, 3, 4, 5]
sorted() имеет дополнительные необязательные аргументы:
reverse=True - сортировка коллекций в обратном порядке
key=func - сортировка с помощью специальной функции, она может быть как стандартной функцией Python, так и быть написанной вами для определенных задач или лямбдой.
Сортировка списка в обратном порядке
my_list = ['b', 'a', 'd', 'c']
my_list = sorted(my_list, reverse=True)
print(my_list) # ['d', 'c', 'b', 'a']
Сортировка списка по длине элемента
my_list = ['world', 'Im', 'sorted list', 'hello']
my_list = sorted(my_list, key=len)
print(my_list) # ['Im', 'world', 'hello', 'sorted list']
Функция reversed()
Функция reversed() работает иначе, чем функция sorted():
Она читает список с конца, а не сортирует элементы
Она возвращает не список, а генератор списка
Ее невозможно применить к неиндексируемым коллекциям - получим исключение TypeError: argument to reversed() must be a sequence
Она не позволяет использовать дополнительные аргументы
Рассмотрим пример:
my_list = [1, 2, 3, 4, 5]
my_list = reversed(my_list)
print(my_list) # <list_reverseiterator object at 0x000001D301599960>, возвращает генератор
Изначально, как и было написано выше, reversed() возвращает генератор списка. Мы можем это поведение двумя способами:
Обернуть reversed() в list():
my_list = [1, 2, 3, 4, 5]
my_list = list(reversed(my_list))
print(my_list) # [5, 4, 3, 2, 1]
Воспользоваться срезами
my_list = [1, 2, 3, 4, 5]
print(my_list[::-1]) # [5, 4, 3, 2, 1]
Методы .sort() и .reverse()
У списка существуют методы .sort() и .reverse(), которые похожи по функционалу на sorted() и reversed(), но имеют и свои существенные отличия:
Изменяют исходный список, без генерации нового
Возвращают None
В них не передается список первым аргументом, если это сделать - будет вызвано исключение
my_list = [1, 4, 2, 3, 5]
my_list.sort()
print(my_list) # [1, 2, 3, 4, 5]
Обратите внимание, если переопределить наш список, то он вернет None
my_list = [1, 4, 2, 3, 5]
my_list = my_list.sort()
print(my_list) # None
.reverse() работает похожим образом
my_list = [1, 4, 2, 3, 5]
my_list.reverse()
print(my_list) # [5, 3, 2, 4, 1]
И он так же возвращает None если переопределить список
my_list = [1, 4, 2, 3, 5]
my_list = my_list.reverse()
print(my_list) # None
Сортировка словарей
Сортировка словарей имеет некоторые особенности:
Для того, чтобы отсортировать словарь по ключам и вернуть список ключей, можем использовать sorted(my_dict), либо sorted(my_dict.keys())
my_dict = {
'name': 'Nikita',
'hobby': 'programming',
}
my_dict = sorted(my_dict)
print(my_dict) # ['hobby', 'name']
Чтобы вернуть отсортированный список значений, используем sorted(my_dict.values())
my_dict = {
'name': 'Nikita',
'hobby': 'programming',
}
my_dict = sorted(my_dict.values())
print(my_dict) # ['Nikita', 'programming']
Для получения списка кортежей, отсортированных по ключу, используем sorted(my_dict.items())
my_dict = {
'name': 'Nikita',
'hobby': 'programming',
}
my_dict = sorted(my_dict.items())
print(my_dict) # [('hobby', 'programming'), ('name', 'Nikita')]