Найти в Дзене
Дойти до IT

Python - Сортировка коллекций

Сортировка коллекций — это одна из ключевых операций, которую часто приходится выполнять при работе с данными. Она позволяет упорядочить элементы коллекции (например, массивы, списки) по определенному критерию: от меньшего к большему, по возрастанию или убыванию, либо по алфавиту. Например, представьте, что вам нужно отсортировать список студентов по фамилии, чтобы удобно было искать нужного человека в журнале, или вывести товары в магазине по цене, начиная с самого дешевого. Эти задачи требуют разных подходов к сортировке, и существуют различные алгоритмы, позволяющие эффективно решать такие проблемы. В 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
Оглавление

Сортировка коллекций

Сортировка коллекций — это одна из ключевых операций, которую часто приходится выполнять при работе с данными. Она позволяет упорядочить элементы коллекции (например, массивы, списки) по определенному критерию: от меньшего к большему, по возрастанию или убыванию, либо по алфавиту.

Например, представьте, что вам нужно отсортировать список студентов по фамилии, чтобы удобно было искать нужного человека в журнале, или вывести товары в магазине по цене, начиная с самого дешевого. Эти задачи требуют разных подходов к сортировке, и существуют различные алгоритмы, позволяющие эффективно решать такие проблемы.

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