Сортировка списка по алфавиту python

Из этого урока вы узнаете о методе сортировки списка Python. Вы увидите, как использовать его со списками с помощью примеров.

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

Метод sort выполняет сортировку элементов списка в восходящем или нисходящем направлении. Его синтаксис выглядит следующим образом:

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

Он просто возвращается к следующей строке, не возвращая никакого вывода.

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

Как работает метод sort

Когда мы вызываем этот метод без аргументов, он перебирает элементы списка в цикле и переставляет их в порядке возрастания.

Если в качестве аргумента указать «reverse = true», список будет отсортирован в порядке убывания.

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

  • Переводы, 20 ноября 2018 в 17:51
  • Никита Прияцелюк

В Python есть встроенная функция sorted() для сортировки итерируемых объектов и метод list.sort() для сортировки списка с заменой исходного. Сегодня мы подробно рассмотрим, как они работают сейчас и как работали раньше.

Основы сортировки

Сделать обычную сортировку по возрастанию очень просто — достаточно вызвать функцию sorted() , которая вернёт новый отсортированный список:

Также можно использовать метод списков list.sort() , который изменяет исходный список (и возвращает None во избежание путаницы). Обычно это не так удобно, как использование sorted() , но если вам не нужен исходный список, то так будет немного эффективнее:

Прим.перев. В Python вернуть None и не вернуть ничего — одно и то же.

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

Прим.перев. При итерировании по словарю Python возвращает его ключи. Если вам нужны их значения или пары «ключ-значение», используйте методы dict.values() и dict.items() соответственно.

Функции-ключи

С версии Python 2.4 у list.sort() и sorted() появился параметр key для указания функции, которая будет вызываться на каждом элементе до сравнения.

Например, вот регистронезависимое сравнение строк:

Читайте также:  Nvidia geforce 9800 gt характеристики 1024

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

«Яндекс», Москва, от 100 000 до 250 000 ₽

Часто можно встретить код, где сложный объект сортируется по одному из его индексов. Например:

Тот же метод работает для объектов с именованными атрибутами:

Функции модуля operator

Показанные выше примеры функций-ключей встречаются настолько часто, что Python предлагает удобные функции, чтобы сделать всё проще и быстрее. Модуль operator содержит функции itemgetter() , attrgetter() и, начиная с Python 2.6, methodcaller() .

С использованием этих функций наши примеры становятся ещё проще:

Функции модуля operator дают возможность использовать множественные уровни сортировки. Например, здесь мы сортируем сначала по оценке, а затем по возрасту:

В следующем примере мы используем функцию methodcaller() для сортировки учеников по взвешенной оценке:

Сортировка по возрастанию и по убыванию

У list.sort() и sorted() есть параметр reverse , принимающий boolean-значение. Он нужен для обозначения сортировки по убыванию. Например, отсортируем учеников по убыванию возраста:

Стабильность сортировки и сложные сортировки

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

Обратите внимание на то, что две записи с ‘blue’ сохранили свой изначальный порядок.

Это замечательное свойство даёт возможность составлять сложные сортировки путём постепенных сортировок. Например, здесь мы сортируем данные учеников сначала по возрасту в порядке возрастания, а затем по оценкам в убывающем порядке, чтобы получить данные, отсортированные в первую очередь по оценке и во вторую — по возрасту:

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

Старый способ «декорируем-сортируем-раздекорируем»

Данная идиома так называется по трём её шагам:

  1. Сначала исходный список дополняется новыми значениями, контролирующими порядок сортировки.
  2. Затем новый список сортируется.
  3. После этого добавленные значения убираются, и в итоге остаётся отсортированный список, содержащий только исходные элементы.

Вот так, например, можно отсортировать данные учеников по оценке:

Это работает из-за того, что кортежи сравниваются лексикографически; сравниваются первые элементы; если они совпадают, то сравниваются вторые и так далее.

Не всегда обязательно включать индекс в декорируемый список, однако он даёт некоторые преимущества:

  1. Сортировка стабильна — если у двух элементов одинаковый ключ, то их порядок не изменится.
  2. У исходных элементов не обязательно должна быть возможность сравнения, так как порядок декорированных кортежей будет определяться максимум по первым двум элементам. Например, исходный список может содержать комплексные числа, которые нельзя сравнивать напрямую.
Читайте также:  Как настроить камеру на ноутбуке windows 8

По-другому эта идиома называется преобразованием Шварца в честь Рэндела Шварца, который популяризировал её среди Perl-программистов.

Для больших списков и списков, где информацию для сравнения дорого вычислять, а также для версий Python ниже 2.4 «декорируем-сортируем-раздекорируем», наверное, будет самым быстрым способом сортировки. Для версий 2.4+ ту же функциональность предоставляют функции-ключи.

Старый способ с использованием параметра cmp

Многие из приведённых здесь примеров подразумевают использование Python версии 2.4 и выше. До этой версии не было функции sorted() , а list.sort() не принимал ключевых аргументов. Вместо этого все версии Python 2.x поддерживали параметр cmp для обработки пользовательских функций сравнения.

В Python 3.0 от этого параметра полностью избавились в целях упрощения языка и разрешения конфликта между операторами сравнения и методами __cmp__() .

В Python 2.x в sort() можно было передать функцию, которая использовалась бы для сравнения элементов. Она должна принимать два аргумента и возвращать отрицательное значение для случая «меньше чем», положительное — для «больше чем» и ноль, если они равны. Например:

Можно сравнивать в обратном порядке:

При портировании кода с версии 2.x на 3.x может возникнуть ситуация, когда нужно преобразовать пользовательскую функцию для сравнения в функцию-ключ. Следующая обёртка упрощает эту задачу:

Чтобы произвести преобразование, просто оберните старую функцию:

В Python 2.7 функция cmp_to_key() была добавлена в модуль functools.

Поддержание порядка сортировки

В стандартной библиотеке Python нет модулей, аналогичных типам данных C++ вроде set и map . Это осознанное решение Гвидо и других для сохранения «единственного очевидного способа сделать это». Python делегирует эту задачу сторонним библиотекам, доступным в Python Package Index. Эти библиотеки используют различные методы для сохранения типов list , dict и set в отсортированном порядке. Поддержание порядка с помощью специальной структуры данных может помочь избежать очень медленного поведения (квадратичного времени выполнения) при наивном подходе с редактированием и постоянной пересортировкой данных. Вот некоторые из модулей, реализующих эти типы данных:

  • SortedContainers — реализация сортированных типов list , dict и set на чистом Python, по скорости не уступает реализациям на Си. Тестирование включает 100% покрытие кода и многие часы стресс-тестирования. В документации можно найти полный справочник по API, сравнение производительности и руководства по внесению своего вклада.
  • rbtree — быстрая реализация на Си для типов dict и set . Реализация использует структуру данных, известную как красно-чёрное дерево.
  • treap — сортированный dict . В реализации используется Декартово дерево, а производительность улучшена с помощью Cython.
  • bintrees — несколько реализаций типов dict и set на основе деревьев на Си. Самые быстрые основаны на АВЛ и красно-чёрных деревьях. Расширяет общепринятый API для предоставления операций множеств для словарей.
  • banyan — быстрая реализация dict и set на Си.
  • skiplistcollections — реализация на чистом Python, основанная на списках с пропусками, предлагает ограниченный API для типов dict и set .
  • blist — предоставляет сортированные типы list , dict и set , основанные на типе данных «blist», реализация на Б-деревьях. Написано на Python и Си.
Читайте также:  Outlook office com почта вход

Прочее

Для сортировки с учётом языка используйте locale.strxfrm() в качестве ключевой функции или locale.strcoll() в качестве функции сравнения.

Параметр reverse всё ещё сохраняет стабильность сортировки. Что интересно, этот эффект можно сымитировать без параметра, использовав встроенную функцию reversed() дважды:

Чтобы создать стандартный порядок сортировки для класса, просто добавьте реализацию соответствующих методов сравнения:

Для типов, сравнение которых работает обычным образом, рекомендуется определять все 6 операторов. Декоратор классов functools.total_ordering упрощает их реализацию.

Функциям-ключам не нужен доступ к внутренним данным сортируемых объектов. Они также могут осуществлять доступ к внешним ресурсам. Например, если оценки ученика хранятся в словаре, их можно использовать для сортировки отдельного списка с именами учеников:

Смотрите также: Хочу научиться программировать на Python: инструкция для начинающих и продолжающих

259370 просмотра

7 ответа

1011 Репутация автора

Я немного запутался в отношении структуры данных в Python; () , [] и <> . Я пытаюсь отсортировать простой список, возможно, так как я не могу определить тип данных, я не могу его отсортировать.

Мой список прост: [‘Stem’, ‘constitute’, ‘Sedge’, ‘Eflux’, ‘Whim’, ‘Intrigue’]

У меня вопрос, что это за тип данных и как сортировать слова по алфавиту?

Ответы (7)

7 плюса

5920 Репутация автора

Вы имеете дело со списком питонов, и сортировать его так же просто, как и делать это.

Автор: Bryan Размещён: 25.12.2012 05:10

8 плюса

1648 Репутация автора

Вы можете использовать встроенную sorted функцию.

178 плюса

5228 Репутация автора

[] обозначает список , () обозначает кортеж и <> обозначает словарь . Вы должны взглянуть на официальный учебник по Python, так как это самые основы программирования на Python.

То, что у вас есть, это список строк. Вы можете отсортировать это так:

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

Вы также можете отсортировать список в обратном порядке, выполнив это: