Как сортировать списки

Мы уже говорили о сортировке словарей Python в одной из статей. Сегодня поговорим о сортировке списков. В этой статье разберемся с методом sort: какие параметры принимает, что определяет key, как сортировать списки списков, кортежей, словарей.

Синтаксис sort

Машинное обучение на Python

Код курса
PYML
Ближайшая дата курса
7 ноября, 2022
Длительность обучения
24 ак.часов
Стоимость обучения
45 000 руб.

Метод sort сортирует элементы списка в возрастающем или убывающем порядке. Работает метод “на месте”, что значит изменяется исходный список, а не возвращается новый. Синтаксис у метода следующий:

list.sort(key=None, reverse=False)

По умолчанию сортировка происходит в возрастающем порядке. У метода два параметра:

  1. key определяет, как именно нужно сортировать через функцию с одним параметром. Этот параметр стоит рассматривать, как элемент списка.
  2. reverse определяет по возрастанию или убыванию сортировать. По умолчанию по возрастанию (False);

Помимо метода sort в Python есть встроенная функция sorted, которая принимает три параметра, где первым является сама итерируемая последовательность, а остальные два — те же самые, что и выше. Различие заключается в том, что sorted не изменяет исходный список, а возвращает сортированный.

Сортировка списка в порядке возрастания и убывания

По умолчанию список сортируется в порядке возрастания reverse=False, поэтому все что требуется, так это вызвать метод sort. Пример кода на Python для сортировки списка в порядке возрастания:

>>> l =  ['a', 'c', 'G', 'y', '0']
>>> l.sort()
>>> l
['0', 'G', 'a', 'c', 'y']

Строки сортируются согласно порядку ASCII (дайте команду man ascii, чтобы ознакомиться с таблицей).

С другой стороны, для сортировки по убыванию, требуется указать reverse=False:

>>> l =  ['a', 'c', '0', 'y', 'G']
>>> l.sort()
>>> l
['y', 'c', 'a', 'G', '0']

Ключ к ключу key

Как уже было сказано, строки сортируются согласно ASCII. А что если нас не волнует с прописной или строчной начинается строка? Мы знаем, что поведение сортировки можно изменить через key. Например, для каждого элемент снизить (или повысить) регистр на нижний. Это сделать можно так:

>>> l =  ['a', 'c', 'G', 'y', 'v']
>>> l.sort()
>>> l
['a', 'c', 'G', 'v', 'y']

А что если мы хотим сортировать по последнему символу? Мы можем определить свою функцию, которая будет брать последний символ:

>>> words = ['apple', 'banana', 'grapefruit', 'plum']
>>>
>>> def get_last(word):
...     return word[-1]
...
>>> words.sort(key=get_last)
>>> words
['banana', 'apple', 'plum', 'grapefruit']

На этих двух примерах видно, что значение у параметра key — двоякое. Во-первых, он может модифицировать элементы списка, а в-вторых, он может выступать как геттер объекта. Причем и то, и другое должны быть функциями (или методами). Причем мы могли бы сделать, чтобы элемент модифицировался и был выбран последний символ:

>>> words = ['APPLE', 'banana', 'grapefruit', 'PLUM']
>>> words.sort(key=get_last)
>>> words
['APPLE', 'PLUM', 'banana', 'grapefruit']
>>> def last_lower(word):
...     return word.lower()[-1]
...
>>> words = ['APPLE', 'banana', 'grapefruit', 'PLUM']
>>> words.sort(key=get_last)
['banana', 'APPLE', 'PLUM', 'grapefruit']

Лямбда-функция в качестве key

Мы уже как-то говорили о лямбда-функциях тут. Это анонимные функции. Если ваша функция состоит из одной строки, то ее можно заменить лямбда-функцией:

>>> words = ['apple', 'banana', 'grapefruit', 'plum']
>>> words = ['apple', 'banana', 'grapefruit', 'plum']
>>> words.sort(key=lambda x: x[-1])
['banana', 'apple', 'plum', 'grapefruit']
>>> words = ['APPLE', 'banana', 'grapefruit', 'PLUM']
>>> words.sort(key=lambda x: x.lower()[-1])
>>> words
['banana', 'APPLE', 'PLUM', 'grapefruit']

Как сортировать список списков

Если у вас есть список, который содержит другие списки, и вам нужно его сортировать согласно их размеру, тогда сделать это можно следующим кодом на Python:

>>> ls = [[1, 3, 2], [4, 5], [6], [8, 9, 10, 7]]
>>> ls.sort(key=len)
[[6], [4, 5], [1, 2, 3], [7, 8, 9, 10]]

Функция len можно применить и к строкам, тогда сортировка будет осуществлять согласно длине строки.

Благодаря возможности сортировки на месте можно сортировать и сами вложенные списки:

>>> ls = [[1, 3, 2], [4, 5], [6], [8, 9, 10, 7]]
>>> for l in ls:
...     l.sort()
...
>>> ls
[[1, 3, 2], [4, 5], [6], [8, 9, 10, 7]]

Как сортировать список кортежей

Очень часто встречается ситуация, когда нужно сортировать список, который содержит кортежи. Например, он получился через метод словаря items. Тогда возникает вопрос, сортировать по ключу или значению? Для кортежей это значит — по первому элементу или второму (или в случае большого количества по последнему).

Тогда сортировать список кортежей можно, написав следующий код на Python:

>>> countries = [('Spain', 10), ('Portugal', 3), ('Italy', 5)]
>>> countries.sort(key=lambda x: x[1], reverse=True)
>>> countries
[('Spain', 10), ('Italy', 5), ('Portugal', 3)]

Как сортировать список словарей

У нас в коде может оказаться список словарей. И нужно сортировать по одному из ключей. Тогда это можно сделать через метод словаря — get.

>>> people = [
...     {'Name': 'Nik', 'Age': '33', 'City': 'London'},
...     {'Name': 'Kate', 'Age': '32', 'City': 'Paris'},
...     {'Name': 'Mike', 'Age': '23', 'City': 'Berlin'}
... ]
>>> people.sort(key=lambda x: x.get('Name'))
>>> people
[{'Name': 'Kate', 'Age': '32', 'City': 'Paris'},
{'Name': 'Mike', 'Age': '23', 'City': 'Berlin'},
{'Name': 'Nik', 'Age': '33', 'City': 'London'}]

О том, как применять различные алгоритмы на языке Python на реальных примерах Data Science вы узнаете на курсах в лицензированном учебном центре обучения и повышения квалификации разработчиков, менеджеров, архитекторов, инженеров, администраторов, Data Scientist’ов и аналитиков Big Data в Москве.

Машинное обучение на Python

Код курса
PYML
Ближайшая дата курса
7 ноября, 2022
Длительность обучения
24 ак.часов
Стоимость обучения
45 000 руб.
Источники
  1. Sorting HOW TO

Добавить комментарий

Поиск по сайту