Почему не работает sort python

Содержание
  1. Всё о сортировке в Python: исчерпывающий гайд
  2. Всё о сортировке в Python: исчерпывающий гайд
  3. Основы сортировки
  4. Функции-ключи
  5. Функции модуля operator
  6. Сортировка по возрастанию и сортировка по убыванию в Python
  7. Стабильность сортировки и сложные сортировки в Python
  8. Декорируем-сортируем-раздекорируем
  9. Использование параметра cmp
  10. Поддержание порядка сортировки
  11. Прочее
  12. Python .sort () не работает должным образом
  13. 8 ответов
  14. Как использовать sorted() и sort() в Python
  15. Упорядочивание значений с помощью »sorted()»
  16. Сортировка чисел
  17. Сортировка строк
  18. Ограничения и ошибки с сортировкой Python
  19. Списки с несопоставимыми типами данных не могут быть »sorted()»
  20. Когда вы сортируете строки, дела имеют значение
  21. Использование »sorted()» с аргументом «reverse»
  22. »sorted()» с аргументом »key»
  23. Упорядочивание значений с помощью ».sort()»
  24. Когда использовать »sorted()» и когда использовать ».sort()»
  25. Как сортировать в Python: Заключение

Всё о сортировке в Python: исчерпывающий гайд

Всё о сортировке в Python: исчерпывающий гайд

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

Примечание Вы читаете улучшенную версию некогда выпущенной нами статьи.

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

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

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

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

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

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

Рассмотрим основные функции сортировки Python.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Декорируем-сортируем-раздекорируем

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

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

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

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

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

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

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

Использование параметра cmp

Все версии Python 2.x поддерживали параметр cmp для обработки пользовательских функций сравнения. В Python 3.0 от этого параметра полностью избавились. В 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, по скорости не уступает реализациям на C. Тестирование включает 100% покрытие кода и многие часы стресс-тестирования. В документации можно найти полный справочник по API, сравнение производительности и руководства по внесению своего вклада.
  • rbtree — быстрая реализация на C для типов dict и set . Реализация использует структуру данных, известную как красно-чёрное дерево.
  • treap — сортированный dict . В реализации используется Декартово дерево, а производительность улучшена с помощью Cython.
  • bintrees — несколько реализаций типов dict и set на основе деревьев на C. Самые быстрые основаны на АВЛ и красно-чёрных деревьях. Расширяет общепринятый API для предоставления операций множеств для словарей.
  • banyan — быстрая реализация dict и set на C.
  • skiplistcollections — реализация на чистом Python, основанная на списках с пропусками, предлагает ограниченный API для типов dict и set .
  • blist — предоставляет сортированные типы list , dict и set , основанные на типе данных «blist», реализация на Б-деревьях. Написано на Python и C.

Прочее

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

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

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

Вас также может заинтересовать статьи:

Хинт для программистов: если зарегистрируетесь на соревнования Huawei Cup, то бесплатно получите доступ к онлайн-школе для участников. Можно прокачаться по разным навыкам и выиграть призы в самом соревновании.

Перейти к регистрации

Источник

Python .sort () не работает должным образом

Решая несколько проблем головоломки тихим субботним вечером (ууууууу . нет), я борюсь с sort (). Результаты не совсем то, что я ожидаю. Программа перебирает каждую комбинацию от 100 до 999 и проверяет, является ли продукт палиндомом. Если это так, добавьте в список. Мне нужен список отсортирован: D Вот моя программа:

Очевидно, что индекс 0 больше 1. Есть идеи, что происходит? У меня есть ощущение, что это как-то связано с концевыми / ведущими нулями, но я бросил быстрый взгляд и не вижу проблемы.

Бонусные баллы, если вы знаете, откуда взялась головоломка: P

8 ответов

Вы сортируете строки, а не числа. ‘101101’ потому что ‘1’ . Замените list.append(reversed) на list.append(int(reversed)) , и он будет работать (или использовать другую функцию сортировки).

Оператор сравнения обрабатывает ваш ввод как строки, а не как целые числа. В сравнении строк 2 третья буква лексически больше 1. перевернутый = str (мульт) [:: — 1]

Нет, это сортировка правильно, просто она сортирует лексикографически , и вы хотите сортировку числовой . так что удалите «str ()»

Ваши числа хранятся в виде строк, поэтому Python сортирует их соответствующим образом. Итак: «101x» предшествует «102x» (так же, как «abcd» будет предшествовать «az»).

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

Вы сортируете строки, а не числа. Строки сравниваются слева направо.

Ваш список содержит строки, поэтому он сортирует их по алфавиту — попробуйте преобразовать список в целые числа, а затем выполните сортировку.

Сортировка делает свое дело. Если вы намеревались хранить целые числа в списке, воспользуйтесь советом Лукаша. Вы также можете указать сортировку, например, путем создания целых:

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

(Кстати, list — действительно плохое имя переменной, так как вы переопределяете встроенный тип list ()!)

Источник

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

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

В этом руководстве вы узнаете, как сортировать различные типы данных в разных структурах данных, настраивать порядок и работать с двумя различными методами сортировки в Python.

К концу этого урока вы узнаете, как:

  • Реализовать базовую сортировку и упорядочение Python в структурах данных.
  • Различать sorted() и .sort()
  • Настроить сложный порядок сортировки в своем коде на основе уникальных требований.

Для этого урока вам понадобится базовое понимание списков и кортежей, а также комплектов Python-множеств. Эти структуры данных будут использоваться в этом руководстве, и с ними будут выполняться некоторые основные операции. Кроме того, в этом учебнике используется Python 3, поэтому пример вывода в этом учебнике может немного отличаться, если вы используете Python 2.

Упорядочивание значений с помощью »sorted()»

Чтобы начать работу с сортировкой Python, вы сначала узнаете, как сортировать как числовые, так и строковые данные.

Сортировка чисел

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

Вывод этого кода — новый отсортированный список. Когда исходная переменная печатается, начальные значения не изменяются.

Этот пример показывает четыре важных характеристики sorted() :

  1. Функция sorted() не должна быть определена. Это встроенная функция, которая доступна в стандартной библиотеке Python.
  2. sorted() , без дополнительных аргументов или параметров, упорядочивает значения в «числах» в порядке возрастания, то есть от наименьшего к наибольшему.
  3. Исходная переменная numbers не изменяется, поскольку sorted() предоставляет отсортированный вывод и не меняет исходное значение в принятом списке.
  4. Когда вызывается sorted() , он предоставляет упорядоченный список в качестве возвращаемого значения.

Эта последняя точка означает, что sorted() может использоваться в списке, и выходные данные могут быть немедленно назначены переменной:

В этом примере теперь есть новая переменная numbers_sorted , которая хранит выходные данные sorted() .

Вы можете подтвердить все эти наблюдения, вызвав help() on sorted() . Необязательные аргументы key и reverse будут рассмотрены позже в руководстве:

Техническая информация: Если вы переходите с Python 2 и знакомы с его одноименной функцией, вам следует знать о нескольких важных изменениях в Python 3:

  1. sorted() в Python 3 не имеет параметра cmp . Вместо этого только key используется для введения пользовательской логики сортировки.
  2. key и reverse должны передаваться как аргументы ключевых слов, в отличие от Python 2, где они могут передаваться как позиционные аргументы.

Если вам нужно преобразовать функцию cmp Python 2 в функцию key , тогда посмотрите functools.cmp_to_key() . Этот учебник не будет охватывать какие-либо примеры использования Python 2.

sorted() может использоваться для кортежей и наборов похожим образом:

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

Значение numbers_set_sorted при приведении к set не упорядочено, как ожидалось. Другая переменная, numbers_tuple_sorted , сохранила отсортированный порядок.

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

Типы str сортируются аналогично другим итерируемым элементам, таким как list и tuple. В приведенном ниже примере показано, как sorted() выполняет итерацию каждого символа в переданном ему значении и упорядочивает их в выходных данных:

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

.split() может изменить это поведение и очистить вывод, а .join() может собрать все это вместе. Мы рассмотрим конкретный порядок вывода и почему это так в ближайшее время:

Исходное предложение в этом примере преобразуется в список слов вместо того, чтобы оставлять его как str . Этот список затем сортируется и объединяется, чтобы снова сформировать str вместо списка.

Ограничения и ошибки с сортировкой Python

Стоит отметить некоторые ограничения и странное поведение, которое может возникнуть, когда вы используете Python для сортировки значений помимо целых чисел.

Списки с несопоставимыми типами данных не могут быть »sorted()»

Существуют типы данных, которые нельзя сравнивать друг с другом, используя просто sorted() , потому что они слишком разные. Python вернет ошибку, если вы попытаетесь использовать sorted() в списке, содержащем несопоставимые данные. В этом примере None и int в одном списке не могут быть отсортированы из-за их несовместимости:

Эта ошибка показывает, почему Python не может сортировать значения, данные ему. Он пытается упорядочить значения, используя оператор меньше чем ( ), чтобы определить, какое значение меньше в порядке сортировки. Вы можете повторить эту ошибку, сравнив вручную два значения:

Тот же TypeError генерируется, когда вы пытаетесь сравнить два несопоставимых значения без использования sorted() .

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

Например, должно ли число 1 идти перед словом apple ? Однако, если итеративный объект содержит комбинацию целых чисел и строк, которые являются числами, их можно привести к сопоставимым типам данных с использованием понимания списка:

Каждый элемент в mixed_numbers вызывает int() для преобразования любых значений str в значения int . Затем вызывается sorted() , который может успешно сравнить каждый элемент и предоставить отсортированный вывод.

Python также может неявно преобразовывать значение в другой тип. В приведенном ниже примере оценка 1 является ложным утверждением, поэтому результатом оценки будет False . Число 1 может быть преобразовано в True как тип bool , в то время как 0 преобразуется в False .

Даже если элементы в списке выглядят по-разному, все они могут быть преобразованы в логические значения ( True или False ) и сопоставлены друг с другом с помощью sorted() :

‘A’ == ‘B’ и 1 преобразуются в False и возвращаются в упорядоченном выводе.

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

Если вы проверите исходный порядок и отсортированный вывод, вы увидите, что 1 == 2 преобразуется в False , и весь отсортированный вывод находится в исходном порядке.

Когда вы сортируете строки, дела имеют значение

sorted() может использоваться в списке строк для сортировки значений в порядке возрастания, который по умолчанию выглядит в алфавитном порядке:

Однако Python использует кодовую точку Unicode первой буквы в каждой строке, чтобы определить порядок сортировки по возрастанию. Это означает, что sorted() не будет обрабатывать имена Al и al одинаково. В этом примере функция ord() возвращает кодовую точку Unicode первой буквы в каждой строке:

name[0] возвращает первый символ в каждом элементе sorted (names_with_case) , а ord() предоставляет кодовую точку Unicode. Несмотря на то, что a идет перед M в алфавите, кодовая точка для M стоит перед a , поэтому в отсортированном выводе сначала будет M .

Если первая буква одинакова, то sorted() будет использовать второй символ для определения порядка, а третий символ, если он одинаковый, и так далее, вплоть до конца строки:

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

Строки, которые содержат одинаковые значения, будут отсортированы в кратчайшие и самые длинные из-за того, что у более коротких строк нет элементов для сравнения с более длинными строками:

Самая короткая строка h упорядочивается первой, а самая длинная hhhhh — последней.

Использование »sorted()» с аргументом «reverse»

Как показано в документации help() для sorted() , существует необязательный ключевой аргумент с именем reverse , который изменит поведение сортировки на основе присвоенного ему логического значения. Если для reverse назначено True , сортировка будет осуществляться в порядке убывания:

Логика сортировки остается той же, то есть имена сортируются по первой букве. Но вывод был инвертирован с ключевым словом reverse , установленным в True .

Когда назначено «False», порядок будет оставаться в порядке возрастания. Любой из предыдущих примеров можно использовать, чтобы увидеть «поведение» реверса, используя «True» или «False»:

»sorted()» с аргументом »key»

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

Чтобы продемонстрировать базовый пример, давайте предположим, что требованием для упорядочения определенного списка является длина строк в списке, от самой короткой до самой длинной. Функция, возвращающая длину строки, len() , будет использоваться с аргументом key :

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

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

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

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

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

В приведенном ниже примере показано определение функции сложения, которая принимает два аргумента. Когда эта функция используется в key в списке чисел, она завершается ошибкой, потому что отсутствует второй аргумент. Каждый раз, когда add() вызывается во время сортировки, он получает только один элемент из списка за раз:

Второе ограничение заключается в том, что функция, используемая с ключом, должна иметь возможность обрабатывать все значения в итерируемых. Например, у вас есть список чисел, представленных в виде строк, которые будут использоваться в sorted() , и key попытается преобразовать их в числа, используя int . Если значение в итерируемом не может быть приведено к целому числу, то функция завершится ошибкой:

Каждое числовое значение в виде str может быть преобразовано в int , но four не может. Это приводит к возникновению ValueError и объясняет, что значение four нельзя преобразовать в int , поскольку оно недопустимо.

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

Если требование к упорядочению состоит в том, чтобы упорядочить итерируемое по последней букве в каждой строке (и если буква совпадает, то использовать следующую букву), тогда function может быть определена и затем использована в сортировке. В приведенном ниже примере определяется функция, которая переворачивает переданную ей строку, а затем эта функция используется в качестве аргумента для key :

Синтаксис слайса word [::-1] используется для обращения строки. К каждому элементу будет применен reverse_word() , а порядок сортировки будет основан на символах в обратном слове.

Вместо написания автономной функции вы можете использовать функцию lambda, определенную в аргументе key.

«Лямбда» — это анонимная функция, которая:

  1. Должен быть определен в строке
  2. Не имеет имени
  3. Не может содержать заявления
  4. Выполняется как функция

В приведенном ниже примере key определяется как лямбда без имени, аргумент, принимаемый лямбда, равен x , а x [::-1] — операция, которая будет выполнена. на аргумент:

x [::-1] вызывается для каждого элемента и меняет слово на обратное. Этот обратный вывод затем используется для сортировки, но исходные слова все еще возвращаются.

Если требование изменяется, и порядок также должен быть обратным, тогда ключевое слово reverse может использоваться вместе с аргументом key :

Функции lambda также полезны, когда вам нужно отсортировать объекты class на основе свойства. Если у вас есть группа учеников, и вам нужно отсортировать их по итоговой оценке, от наивысшей к наименьшей, то для получения свойства grade из class можно использовать lambda:

В этом примере используется namedtuple для создания классов с атрибутами name и grade . Lambda вызывает getattr() для каждого элемента и возвращает значение для grade .

Параметр «reverse» имеет значение «True», чтобы переворачивать восходящий вывод в нисходящий, чтобы самые высокие оценки были упорядочены первыми.

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

Упорядочивание значений с помощью ».sort()»

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

Во-первых, sort это метод класса list и может использоваться только со списками. Это не встроенная переменная, переданная ей.

Во-вторых, .sort() возвращает None и изменяет значения на месте. Давайте посмотрим на влияние обоих этих различий в коде:

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

  1. Нет упорядоченного вывода .sort() , поэтому присваивание новой переменной только передает тип None .
  2. Список «values_to_sort» был изменен на месте, и исходный порядок никак не поддерживается.

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

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

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

  1. Разбейте каждую фразу на список слов
  2. Найдите третий элемент или слово в этом случае
  3. Найдите в этом слове вторую букву

Когда использовать »sorted()» и когда использовать ».sort()»

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

Допустим, скоро будет 5к гонка: первый ежегодный питон 5к. Данные из гонки должны быть собраны и отсортированы. Данные, которые должны быть получены, это номер нагрудника бегуна и количество секунд, которое потребовалось, чтобы закончить гонку:

Когда бегуны пересекают финишную черту, каждый Runner будет добавлен в список, который называется runners . В гонках на 5 км не все бегуны пересекают стартовую линию одновременно, поэтому первый человек, который пересечет финишную черту, на самом деле не может быть самым быстрым человеком:

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

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

Не существует требований для нескольких типов сортировки по различным атрибутам. Список разумного размера. Там нет упоминания о хранении списка где-то. Просто отсортируйте по продолжительности и возьмите пять участников с наименьшей продолжительностью:

Программист выбирает использование lambda в аргументе key , чтобы получить атрибут duration от каждого бегуна и отсортировать runners на месте с помощью .sort() . После сортировки runners ‘первые 5 элементов сохраняются в top_five_runners`.

Миссия выполнена! Приходит директор гонки и сообщает программисту, что, поскольку текущая версия Python 3.7, они решили, что каждый тридцать седьмой человек, который пересек финишную черту, получит бесплатную спортивную сумку.

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

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

В качестве альтернативы, бегуны могли бы быть отсортированы с использованием sorted() и с использованием той же самой лямбды:

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

every_thirtyseventh_runners создается с использованием шага в синтаксисе фрагмента списка на` runners ‘, который по-прежнему содержит исходный порядок, в котором бегуны пересекли финишную черту.

Как сортировать в Python: Заключение

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

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

Для заядлых Pythonistas, ищущих проблемы с сортировкой, попробуйте использовать более сложные типы данных в сортировке: вложенные итерации. Кроме того, вы можете погрузиться в реализации кода Python с открытым исходным кодом для встроенных модулей и прочитать об алгоритме сортировки, используемом в Python, под названием Timsort.​

Источник

Читайте также:  Как настроить экран закладок
Оцените статью