Python: сортировка списков методом .sort() с ключом — простыми словами
Поводом опубликовать пост стало то, что при детальном изучении списков (массивов) в Python я не смог найти в сети ни одного простого описания метода сортировки элементов с использованием ключа: list.sort(key=. ).
Может быть, конечно, это мне так не повезло и я долго понимаю простые для всех вещи, однако я думаю, что приведенная ниже информация будет весьма полезна таким же начинающим питонистам, как и я сам.
Итак, что мы имеем. Предположим, у нас есть список, который мы бы хотели отсортировать — и состоит он из трех строк разной длины в определенной последовательности:
sortList = [‘a’, ‘сс’, ‘bbb’]
Сортировка элементов массива методом .sort() производится по умолчанию лексикографически — проще говоря, в алфавитном порядке, а также от меньшего значения к большему. Поэтому если мы выполним:
то получим на выходе:
Однако метод .sort() позволяет нам изменять и принцип, и порядок сортировки.
Для изменения принципа сортировки используется ключевое слово key, которое стало доступным начиная с версии Python 2.4.
Предположим, нам хотелось бы отсортировать наш список двумя способами: 1. в алфавитном порядке; 2. по длине строки. Первый способ, впрочем, уже работает как сортировка по умолчанию, однако мы можем добиться таких же результатов и с помощью параметра key:
sortList = [‘a’, ‘cc’, ‘bbb’]
# Создаем «внешнюю» функцию, которая будет сортировать список в алфавитном порядке:
def sortByAlphabet(inputStr):
return inputStr[0] # Ключом является первый символ в каждой строке, сортируем по нему
# Вторая функция, сортирующая список по длине строки:
def sortByLength(inputStr):
return len(inputStr) # Ключом является длина каждой строки, сортируем по длине
print u’Исходный список: ‘, sortList # >>> [‘a’, ‘cc’, ‘bbb’]
sortList.sort(key=sortByAlphabet) # Каждый элемент массива передается в качестве параметра функции
print u’Отсортировано в алфавитном порядке: ‘, sortList # >>> [‘a’, ‘bbb’, ‘cc’]
sortList.sort(key=sortByLength) # Каждый элемент массива передается в качестве параметра функции
print u’Отсортировано по длине строки: ‘, sortList # >>> [‘a’, ‘cc’, ‘bbb’]
# Теперь отсортируем по длине строки, но в обратном порядке:
sortList.sort(key=sortByLength, reverse=True) # В обратном порядке
print u’Отсортировано по длине строки, в обратном порядке: ‘, sortList # >>> [‘bbb’, ‘cc’, ‘a’]
Обратите внимание, что метод .sort() производит действия с исходным списком, переставляя элементы внутри него самого, и НЕ возвращает отсортированную копию исходного списка. Для получения отсортированной копии нужно использовать метод sorted:
— либо такой же вариант, но с параметром key (аналогично описанному выше):
newList = sorted(sortList, key=sortByLength)
У метода .sorted() есть и другие параметры, но мне они показались не настолько запутанными для самостоятельного разбора.
Сортировка списка Python
Сортировка данных — одна из самых распространенных задач при работе с Python. Например, вы можете отсортировать список членов команды по именам или список проектов в порядке приоритета.
В этой статье описывается, как сортировать списки в Python .
Python sort() и sorted()
В Python, вы можете сортировать список с помощью встроенного в list.sort() метод или встроенный в sorted() функцию.
Функция sorted() создает новый отсортированный список, а метод list.sort() сортирует список на месте. Если вы хотите сохранить, несортированный список используйте функцию sorted() . Еще одно отличие состоит в том, что функция sorted sorted() работает с любым итерируемым объектом.
Синтаксис sort() и sorted() следующий:
Необязательные ключевые аргументы key и reverse имеют следующее значение:
- key — функция, которая принимает один аргумент и преобразует его перед сравнением. Функция должна возвращать одно значение, которое используется для сравнения сортировки.
- reverse — значение reverse может быть True или False . Значение по умолчанию — True . Если для этого аргумента установлено значение false, список сортируется в обратном порядке.
Элементы списка сравниваются с помощью оператора «меньше чем» ( < ) и сортируются в порядке возрастания. Оператор < не поддерживает сравнение строки с целым числом, поэтому, если у вас есть список, содержащий строки и целые числа, операция сортировки завершится ошибкой.
В следующем примере показано, как отсортировать список строк в алфавитном порядке:
Если вы хотите сохранить исходный список без изменений, используйте функцию sorted() :
Чтобы отсортировать список в обратном (по убыванию) порядке, установите reverse аргумент в True :
Сортировка с функцией
Аргумент key принимает функцию и позволяет выполнять более сложные операции сортировки.
Самый простой пример — отсортировать элементы по их длине:
Мы используем функцию len() чтобы вернуть количество символов в строке, которая используется в качестве компаратора:
Вы также можете создать пользовательскую функцию и использовать ее в качестве key аргумента для сравнения. Вот пример, показывающий, как отсортировать список целых чисел по сумме их цифр:
Другой пример — использование ключевого аргумента для сортировки сложного списка, такого как список кортежей:
Мы используем анонимную (лямбда) функцию, которая возвращает первый элемент кортежа. Список отсортирован по значению, возвращаемому функцией:
Тот же подход можно использовать для сортировки списка словарей:
Лямбда-функция возвращает значение ключа name , которое используется для сравнения:
Лучший и более быстрый способ сортировки сложной функции — использовать функции модуля Оператор . Вот пример:
Функция itemgetter извлекает значение symbol ключа:
Выводы
Мы показали вам, как сортировать списки в Python с помощью метода sort() и функции sorted() .
Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь оставлять комментарии.
Сортировка списков в Python
В Python данные можно сортировать с помощью методов sorted() или sort() . В этой статье мы поговорим о том, как работает сортировка списков в Python. Разберем примеры кода для методов sorted() и sort() и посмотрим, чем они отличаются.
Что такое метод sort() в Python?
Этот метод берет список и сортирует его. То есть на выходе мы получаем тот же список, только отсортированный. Этот метод не возвращает никакого значения.
В этом примере у нас есть список чисел, и мы можем использовать метод sort() для сортировки списка в порядке возрастания.
Выполним наш код и получим следующий результат:
Однако если список уже отсортирован, то мы получим None.
Метод sort() может принимать два необязательных аргумента: key и reverse .
Значением key выступает функция, которая будет вызываться для каждого элемента в списке.
От редакции Pythonist. О функциях и их аргументах у нас есть отдельная статья — «Функции и их аргументы в Python 3».
В следующем примере давайте используем функцию len() в качестве значения аргумента key. Таким образом, key=len скажет компьютеру отсортировать список имен по длине, от наименьшего к наибольшему.
Вот, что мы получим:
Аргумент reverse может иметь логическое значение: True (Истина) или False (Ложь).
В следующем примере reverse=True укажет компьютеру отсортировать список в обратном алфавитном порядке.
Как использовать метод sorted() в Python
Этот метод превращает итерируемый объект в отсортированный список. Итерируемыми объектами могут быть списки, строки и кортежи.
Одно из ключевых различий между sort() и sorted() заключается в том, что sorted() вернет новый список, а sort() сортирует уже имеющийся.
В следующем примере у нас есть список чисел, который нужно отсортировать в порядке возрастания.
Метод sorted() тоже принимает необязательные аргументы. Они такие же, как и у sort() : key и reverse .
Давайте разберем следующий пример. У нас есть список чисел. Пропишем необязательный аргумент reverse=True . Он укажет компьютеру отсортировать список от наибольшего числа к наименьшему.
Метод sorted() для других типов данных
Еще одно ключевое различие между sorted() и sort() заключается в том, что метод sorted() принимает любые итерируемые объекты (списки, строки, кортежи и т.д.), тогда как метод sort() работает только со списками.
Давайте разобьём строку на отдельные слова с помощью метода split() , а затем используем метод sorted() для сортировки слов по длине от наименьшего к наибольшему.
А теперь давайте чуть изменим наш пример. Добавим необязательный аргумент reverse . Благодаря этому список будет отсортирован в обратном порядке, от самого длинного слова к самому короткому.
Мы также можем использовать метод sorted() и для кортежей.
В этом примере у нас есть набор кортежей, которые представляют имя, возраст и музыкальный инструмент учащихся какой-то группы.
Мы можем использовать метод sorted() для сортировки этих данных по возрасту учащегося. Аргумент key будет иметь значение лямбда-функции, которая сообщает компьютеру о сортировке по возрасту в порядке возрастания.
Лямбда-функция – это анонимная функция. Этот тип функции можно определить с помощью ключевого слова lambda .
Итак, напишем следующую лямбду-функцию, которая будет говорить нашей программе, что отсортировать мы хотим именно по возрасту:
Чтобы получить доступ к значению в кортеже, мы используем квадратные скобки [] и индекс элемента в кортеже, к которому хотим получить доступ. Поскольку в Python отсчет идет с нуля, возраст у нас будет под индексом [1] .
Таким образом, мы получаем следующий код:
Мы можем изменить этот пример. Давайте отсортируем кортежи по названиям музыкальных инструментов. Более того, давайте используем reverse=True для сортировки инструментов в обратном алфавитном порядке.
Заключение
В этой статье мы разобрали, как работает сортировка списков в Python. Узнали, как работать с такими методами, как sort() и sorted() , и в чем их различия.
Метод sort() работает только со списками и сортирует уже имеющийся список. Данный метод ничего не возвращает.
А метод sorted() работает с любыми итерируемыми объектами и возвращает новый отсортированный список. В качестве итерируемых объектов могут выступать списки, строки, кортежи и другие.
У обоих этих методов есть два необязательных аргумента: key и reverse .
Значением аргумента key может быть функция. Она будет вызываться для каждого элемента в списке. По этой функции, собственно, и будет проводиться сортировка.
Функция sorted#
Функция sorted возвращает новый отсортированный список, который получен из итерируемого объекта, который был передан как аргумент. Функция также поддерживает дополнительные параметры, которые позволяют управлять сортировкой.
Первый аспект, на который важно обратить внимание — sorted всегда возвращает список.
Если сортировать список элементов, то возвращается новый список:
При сортировке кортежа также возвращается список:
Если передать sorted словарь, функция вернет отсортированный список ключей:
reverse#
Флаг reverse позволяет управлять порядком сортировки. По умолчанию сортировка будет по возрастанию элементов.
Указав флаг reverse, можно поменять порядок:
С помощью параметра key можно указывать, как именно выполнять сортировку. Параметр key ожидает функцию, с помощью которой должно быть выполнено сравнение.
Например, таким образом можно отсортировать список строк по длине строки:
Если нужно отсортировать ключи словаря, но при этом игнорировать регистр строк:
Параметру key можно передавать любые функции, не только встроенные. Также тут удобно использовать анонимную функцию lambda.
С помощью параметра key можно сортировать объекты не по первому элементу, а по любому другому. Но для этого надо использовать или функцию lambda, или специальные функции из модуля operator.
Например, чтобы отсортировать список кортежей из двух элементов по второму элементу, надо использовать такой прием:
Пример сортировки разных объектов#
Сортировка выполняется по первому элементу, например, по первому символу в списке строк, если он одинаковый, по второму и так далее. Сортировка выполняется по коду Unicode символа. Для символов из одного алфавита, это значит что сортировка по сути будет по алфавиту.
Пример сортировки списка строк:
Некоторые данные будут сортироваться неправильно, например, список IP-адресов:
Это происходит потому используется лексикографическая сортировка. Чтобы в данном случае сортировка была нормальной, надо или использовать отдельный модуль с натуральной сортировкой (модуль natsort) или сортировать, например, по двоичному/десятичному значению адреса.
Пример сортировки IP-адресов по двоичному значению. Сначала создаем функцию, которая преобразует IP-адреса в двоичный формат:
Сортировка с использованием функции bin_ip:
Также дальше будет рассматриваться модуль ipaddress, который позволит создавать специальные объекты, которые соответствуют IP-адресу и они уже сортируются правильно по десятичному значению.