Сортировка списков в Python

В Python данные можно сортировать с помощью методов sorted() или sort(). В этой статье мы поговорим о том, как работает сортировка списков в Python. Разберем примеры кода для методов sorted() и sort() и посмотрим, чем они отличаются.

Что такое метод sort() в Python?

Этот метод берет список и сортирует его. То есть на выходе мы получаем тот же список, только отсортированный. Этот метод не возвращает никакого значения.

В этом примере у нас есть список чисел, и мы можем использовать метод sort() для сортировки списка в порядке возрастания.

my_list = [67, 2, 999, 1, 15]

# Выводим неупорядоченный список:
print("Unordered list: ", my_list)

# Сортировка списка
my_list.sort()

# Выводим упорядоченный список
print("Ordered list: ", my_list)

Выполним наш код и получим следующий результат:

Unordered list:  [67, 2, 999, 1, 15]
Ordered list:  [1, 2, 15, 67, 999]

Однако если список уже отсортирован, то мы получим None.

my_list = [6, 7, 8, 9, 10]

# Это строка вернет None, потому что список уже отсортирован
print(my_list.sort())

Метод sort() может принимать два необязательных аргумента: key и reverse.

Значением key выступает функция, которая будет вызываться для каждого элемента в списке.

От редакции Pythonist. О функциях и их аргументах у нас есть отдельная статья — «Функции и их аргументы в Python 3».

В следующем примере давайте используем функцию len() в качестве значения аргумента key. Таким образом, key=len скажет компьютеру отсортировать список имен по длине, от наименьшего к наибольшему.

names = ["Jessica", "Ben", "Carl", "Jackie", "Wendy"]

print("Unsorted: ", names)
names.sort(key=len)
print("Sorted: ", names)

Вот, что мы получим:

Unsorted:  ['Jessica', 'Ben', 'Carl', 'Jackie', 'Wendy']
Sorted:  ['Ben', 'Carl', 'Wendy', 'Jackie', 'Jessica']

Аргумент reverse может иметь логическое значение: True (Истина) или False (Ложь).

В следующем примере reverse=True укажет компьютеру отсортировать список в обратном алфавитном порядке.

names = ["Jessica", "Ben", "Carl", "Jackie", "Wendy"]

print("Unsorted: ", names)
names.sort(reverse=True)
print("Sorted: ", names)

# Результат:
# Unsorted:  ['Jessica', 'Ben', 'Carl', 'Jackie', 'Wendy']
# Sorted:  ['Wendy', 'Jessica', 'Jackie', 'Carl', 'Ben']
[python_ad_block]

Как использовать метод sorted() в Python

Этот метод превращает итерируемый объект в отсортированный список. Итерируемыми объектами могут быть списки, строки и кортежи.

Одно из ключевых различий между sort() и sorted() заключается в том, что sorted() вернет новый список, а sort() сортирует уже имеющийся.

В следующем примере у нас есть список чисел, который нужно отсортировать в порядке возрастания.

sorted_numbers = sorted([77, 22, 9, -6, 4000])

print("Sorted in ascending order: ", sorted_numbers)

# Результат:
# Sorted in ascending order:  [-6, 9, 22, 77, 4000]

Метод sorted() тоже принимает необязательные аргументы. Они такие же, как и у sort(): key и reverse.

Давайте разберем следующий пример. У нас есть список чисел. Пропишем необязательный аргумент reverse=True. Он укажет компьютеру отсортировать список от наибольшего числа к наименьшему.

sorted_numbers = sorted([77, 22, 9, -6, 4000], reverse=True)

print("Sorted in descending order: ", sorted_numbers)

# Результат:
# Sorted in descending order:  [4000, 77, 22, 9, -6]

Метод sorted() для других типов данных

Еще одно ключевое различие между sorted() и sort() заключается в том, что метод sorted() принимает любые итерируемые объекты (списки, строки, кортежи и т.д.), тогда как метод sort() работает только со списками.

Давайте разобьём строку на отдельные слова с помощью метода split(), а затем используем метод sorted() для сортировки слов по длине от наименьшего к наибольшему.

my_sentence = "Jessica found a dollar on the ground"

# Вывод оригинального предложения: 
print("Original sentence: ", my_sentence)

# Вывод отсортированного списка слов:
print(sorted(my_sentence.split(), key=len))

# Результат:
# Original sentence:  Jessica found a dollar on the ground
# ['a', 'on', 'the', 'found', 'dollar', 'ground', 'Jessica']

А теперь давайте чуть изменим наш пример. Добавим необязательный аргумент reverse. Благодаря этому список будет отсортирован в обратном порядке, от самого длинного слова к самому короткому.

my_sentence = "Jessica found a dollar on the ground"

print("Original sentence: ", my_sentence)
print(sorted(my_sentence.split(), key=len, reverse=True))

# Результат:
# Original sentence:  Jessica found a dollar on the ground
# ['Jessica', 'dollar', 'ground', 'found', 'the', 'on', 'a']

Мы также можем использовать метод sorted() и для кортежей.

В этом примере у нас есть набор кортежей, которые представляют имя, возраст и музыкальный инструмент учащихся какой-то группы.

band_students = [
    ('Danny', 17, 'Trombone'),
    ('Mary', 14, 'Flute'),
    ('Josh', 15, 'Percussion')
]

Мы можем использовать метод sorted() для сортировки этих данных по возрасту учащегося. Аргумент key будет иметь значение лямбда-функции, которая сообщает компьютеру о сортировке по возрасту в порядке возрастания.

Лямбда-функция – это анонимная функция. Этот тип функции можно определить с помощью ключевого слова lambda.

Итак, напишем следующую лямбду-функцию, которая будет говорить нашей программе, что отсортировать мы хотим именно по возрасту:

lambda student: student[1]

Чтобы получить доступ к значению в кортеже, мы используем квадратные скобки [] и индекс элемента в кортеже, к которому хотим получить доступ. Поскольку в Python отсчет идет с нуля, возраст у нас будет под индексом [1].

Таким образом, мы получаем следующий код:

band_students = [
    ('Danny', 17, 'Trombone'),
    ('Mary', 14, 'Flute'),
    ('Josh', 15, 'Percussion')
]

print(sorted(band_students, key=lambda student: student[1]))

# Результат:
# [('Mary', 14, 'Flute'), ('Josh', 15, 'Percussion'), ('Danny', 17, 'Trombone')]

Мы можем изменить этот пример. Давайте отсортируем кортежи по названиям музыкальных инструментов. Более того, давайте используем reverse=True для сортировки инструментов в обратном алфавитном порядке.

band_students = [
    ('Danny', 17, 'Trombone'),
    ('Mary', 14, 'Flute'),
    ('Josh', 15, 'Percussion')
]

print(sorted(band_students, key=lambda student: student[2], reverse=True))

# Результат:
# [('Danny', 17, 'Trombone'), ('Josh', 15, 'Percussion'), ('Mary', 14, 'Flute')]

Заключение

В этой статье мы разобрали, как работает сортировка списков в Python. Узнали, как работать с такими методами, как sort() и sorted(), и в чем их различия.

Метод sort() работает только со списками и сортирует уже имеющийся список. Данный метод ничего не возвращает.

А метод sorted() работает с любыми итерируемыми объектами и возвращает новый отсортированный список. В качестве итерируемых объектов могут выступать списки, строки, кортежи и другие.

У обоих этих методов есть два необязательных аргумента: key и reverse.

Значением аргумента key может быть функция. Она будет вызываться для каждого элемента в списке. По этой функции, собственно, и будет проводиться сортировка.

Значением аргумента reverse может быть True или False.

Надеемся, эта статья была для вас полезна. Успехов в написании кода!

Перевод статьи «Python Sort List – How to Order By Descending or Ascending».