Как сделать сортировку по убыванию в python

Обновлено: 05.07.2024

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

Использование sorted() для итерируемых объектов Python

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

С помощью этого метода можно отсортировать любой итерируемый объект Python, например список или массив.

Реализация MergeSort и QuickSort

Здесь мы исследуем два других часто используемых метода сортировки, используемых на практике, а именно алгоритмы MergeSort и QuickSort.

1. Алгоритм MergeSort

Алгоритм использует восходящий подход Divide and Conquer, сначала разделяя исходный массив на подмассивы, а затем объединяя индивидуально отсортированные подмассивы, чтобы получить окончательный отсортированный массив.

В приведенном ниже фрагменте кода метод mergesort_helper() выполняет фактическое разделение на подмассивы, а метод perform_merge() объединяет два ранее отсортированных массива в новый отсортированный.

2. Алгоритм быстрой сортировки

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

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

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

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

Здесь метод quicksort_helper выполняет шаг подхода Divide and Conquer, в то время do_partition метод do_partition разделяет массив вокруг точки поворота и возвращает позицию точки поворота, вокруг которой мы продолжаем рекурсивно разбивать подмассив до и после точки поворота, пока не будет весь массив отсортирован.


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

1. Стандартная сортировка

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

2. Сортировка сложных структур с использованием ключа

Это нормально работать с вещами, у которых по природе есть определенный порядок, вроде чисел или строк, но что делать с более сложными структурами? Здесь функция sorted() демонстрирует свое великолепие. Функция sorted() принимает ключ в качестве опционально названного параметра. Этот ключ должен быть, сам по себе, функцией, которая принимает один параметр, которая затем используется функцией sorted(), для определения значения в целях дальнейшей сортировки. Давайте взглянем на пример. Скажем, у нас есть класс Person с такими атрибутами как имя и возраст:

(Функция __repr__ является специальной функцией, которая используется для переопределения того, как объект будет представлен в интерпретаторе Python)

Причина, по которой я определил функцию – это выделение порядка сортировки. По умолчанию, представление определенных пользователем объектов выглядит примерно так: “ ”. Если оставить все как есть, то отличать различные экземпляры в будущих примерах будет несколько затруднительно для нас.

Давайте сделаем список людей:

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

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

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

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

Давайте взглянем на еще один код, на этот раз определяем возраст как значение для сортировки:

3. Обратная сортировка

Функция sorted() намного упрощает сортировку в обратном порядке. Функция принимает опциональный параметр под названием reverse, который действует по строгой логике.

4. Сортировка с использованием функции attrgetter

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

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

Таким образом, attrgetter(name) возвращает функцию, которая ведет себя также как и определенная раннее нашей функцией byName_key():

Функция attrgetter(age) возвращает функцию, которая ведет себя также как и определенная раннее нашей функцией byAge_key():

5. Предварительное использование key в функции сортировки

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

У нашей змеи есть имя, toxicity (токсичность, мерило того, насколько токсичен её яд) и agression (представленная в виде числа от 0 до 1, которое указывает на вероятность того, что змея нападет).

Надежный сайт по продвижению doctorsmm предлагает купить подписчиков на свой Телеграмм канал по очень выгодным и притягательным ценам от 51 рубля за сотню аккаунтов. Кроме того, Вы сможете подобрать наиболее оптимальную для Вашего сообщества скорость поступления, которая доходит до 1000 единиц в сутки.

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

Змеи отсортированы в ожидаемом нами порядке (несмотря на то, что гремучая змея (rattlesnake) более ядовита, чем кобра (kingCobra), уровень агрессивности кобры делает её более опасной).

6. Случайная сортировка

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

Функция random() – это часть стандартной библиотеки random, которая выдает числа в случайном порядке от 0 до 1. Сортировка с использованием данного ключа выдает, кто бы мог подумать, случайный порядок:

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

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

Числа сравнивают как числа:

Строки сравнивают, как слова в словаре. Какое слово в словаре идет раньше, то и меньше.

То есть сравнивают по символам, начиная с первого.

Списки (list) и кортежи (tuple) сравнивают по элементам.

Если сравнивать типы, которые не сравниваются, получается исключение TypeError .

Функции sort и sorted

Для сортировки используют стандартные функции sort (сортировка списка) и sorted (сортировка последовательности)

  • список.sort(*, key=None, reverse=False) - стабильная сортировка самого списка
  • sorted(iterable, *, key=None, reverse=False) - создается новый отсортированный список, старый остается без изменения

По умолчанию используются стандартные операторы сравнения и сортирует по возрастанию.

reverse=True - в обратном порядке

key=функция - как сравнивать объекты

Отсортируем список по значению модуля каждого числа. Модуль берется функцией abs()

Другой пример. Отсортируем строки по длине.

Ключевая функция (имя которой передается в аргументе key) должна принимать 1 значение (value) и возвращать 1 значение (proxy value). По этому proxy value проходит сортировка.


Отсортируем список строк БЕЗ учета регистра. Для этого будем сортировать строки, которые приведены к нижнему регистру.

Еще пример: отсортируем разнотипные числа как числа.

Как написать функцию для сравнения

Пишем функцию, которая для 1 объекта (аргумента) возвращает proxy value, по которым этот объект будут сравнивать в сортировке

Пример: сортируем строки по последним буквам

Пример: Сортируем по росту и весу

Даны рост (см) и вес (кг) каждого человека. По одному человеку на строку. Отсортируем людей.

Получилась сортировка по возрастанию роста, при одинаковом росте сортируем по весу.

Теперь напишем функцию, которая будет смотреть только на вес и игнорировать рост.

Заметим, что люди с одинаковым весом идут в том же порядке, что и в списке до сортировки: при весе 55.2 сначала 166, потом 157. При весе 73 сначала 166, потом 180.

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

Отсортируем по весу по убыванию. Не будем использовать reverse = True , сделаем это через функцию.

Отсортируем по весу (по возрастанию), а при равном весе - по росту (по возрастанию).

Для этого в функции, которая возвращает proxy values вернем (вес, рост).

Как отсортировать по возрастанию веса и при равном весе по_убыванию роста?

То же самое через lambda-функцию:

Дополнительные материалы

Как обеспечить сравниение объектов классов

Об этом будет рассказано позже, когда будем говорить о классах и объектах.

Алгоритмы сортировки

Саммерфильд, стр 172.

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

Алгоритм был создан Тимом Петерсом (Tim Peters). Интересное описание и обсуждение алгоритма можно найти в файле listsort.txt, который поставляется в составе исходных программных кодов Python.

Сравнение и сортировка в python 3.x

Сравнивание и сортировка в Python 3.0: В Python 2.6 и в более ранних версиях сравнивание выполняется по-разному для объектов разных типов (например, списков и строк) – язык задает способ упорядочения различных типов, который можно признать скорее детерминистским, чем эстетичным. Этот способ упорядочения основан на именах типов, вовлеченных в операцию сравнения, например любые целые числа всегда меньше любых строк, потому что строка "int" меньше, чем строка "str".

При выполнении операции сравнения никогда не выполняется преобразование типов объектов, за исключением сравнивания объектов числовых типов.

В Python 3.0 такой порядок был изменен: попытки сравнивания объектов различных типов возбуждают исключение – вместо сравнивания по названиям типов. Так как метод сортировки использует операцию сравнения, это означает, что инструкция [1, 2, 'spam'].sort() будет успешно выполнена в Python 2.x, но возбудит исключение в версии Python 3.0 и выше. Кроме того, в версии Python 3.0 больше не поддерживается возможность передачи методу sort произвольной функции сравнения, для реализации иного способа упорядочения. Чтобы обойти это ограничение, предлагается использовать именованный аргумент key=func, в котором предусматривать возможность трансформации значений в процессе сортировки, и применять именованный аргумент reverse=True для сортировки по убыванию. То есть фактически выполнять те же действия, которые раньше выполнялись внутри функции сравнения.

1. Отсортировать последовательность целых чисел по возрастанию

2. Отсортировать последовательность целых чисел по убыванию

3. Отсортировать последовательность целых чисел по убыванию модуля числа

Input Output
3 6 -8 2 -78 1 23 -45 9 -78 -45 23 9 -8 6 3 2 1

4. Даты

На каждой строке написана дата в формате dd/mm/yyyy. Выведите даты в порядке возрастания в формате yyyy/mm/dd.

5. Рост, вес

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

6. Студенты

Дан список студентов и их средний балл. Отсортировать по среднему баллу по убыванию, при одинаковом среднем балле - по алфавиту.

7. Точки по удалению от начала координат

Даны координаты точек. Отсортировать их по удалению от точки (0,0).

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

8 Позиция

Даны числа. Напечатайте их по возрастанию четных чисел, нечетные остаются на своих местах

Метод Python List sort, предназначен для сортировки списка в определенном порядке.

Синтаксис и параметры метода sort()

Синтаксис метода sort() :

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

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

Параметры метода sort()

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

  • reverse — Если значение True, отсортированный список идет в обратном порядке, либо сортировка выполнена в порядке убывания.
  • key — Данный параметр можно указать в качестве ключа для сравнения сортировки

Пример 1. Сортировка списка

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

Как мы уже говорили, у метода sort() есть необязательный аргумент reverse . Если мы установим метода reverse=True , то список будет отсортирован в порядке убывания.

Так же можно воспользоваться альтернативным решением, и использовать встроенную функцию в Python, sorted() .

Пример 2. Сортировка в порядке убывания

Пользовательская сортировка списка с помощью ключа

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

Альтернативный вариант с использованием метода sorted() .

В данном случае, len() — это встроенная функция Python, которая применяется для подсчета длины каждого элемента. После того, как у нас есть длина каждого элемента, мы можем отсортировать этот список от наименьшего до наибольшего, или наоборот.

Пример 3. Сортировка списка с помощью ключа

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

  • В первом случае, наша функция возвращает нам имена сотрудников. Так как имя у нас является строкой, то соответственно Python сортирует его в алфавитном порядке.
  • Второй случай возвращает нам возраст, тип данных которого int() , и сортируется в порядке возрастания
  • В третьем случае, функция возвращает зарплату, и ее тип данных тоже int() , в данном случае используется дополнительный параметр reverse со значением True , и сортируется в порядке убывания.

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

Читайте также: