Как отсортировать список в python
Перейти к содержимому

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

  • автор:

Сортировка по произвольным элементам вложенных списков

В Python можно выполнить сортировку списка на месте с помощью метода sort() :

>>> a = [10,3,4,1,9] >>> a.sort() >>> a [1, 3, 4, 9, 10]

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

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

>>> a = [[12,101],[2,200],[18,99]] >>> a.sort() >>> a [[2, 200], [12, 101], [18, 99]]

Что делать, если надо отсортировать не по первому столбцу? На этот случай sort() принимает необязательный аргумент key , в котором передается другая функция. Этой другой функции передается очередной элемент списка. Она может сделать с ним что угодно и вернуть что угодно. По этому «что угодно» и происходит сортировка.

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

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

a = [['петя',10,130,35], ['вася',11,135,39], ['женя',9,140,33],['дима',10,128,30]] n = input('Сортировать по имени (1), возрасту (2), росту (3), весу (4): ') n = int(n)-1 def sort_col(i): return i[n] a.sort(key=sort_col) for i in a: print("%7s %3d %4d %3d" % (i[0],i[1],i[2],i[3]))

Здесь пользователь вводит номер поля. Число приводится к типу int , и из него вычитается единица, т. к. индексация списка начинается с нуля.

Далее определяется функция sort_col() . Ей передается аргумент i , а она возвращает n -ый элемент этого аргумента. Так, если этой функции передать вложенный список, то она вернет его n -й элемент. В данном случае тот, который хотел пользователь.

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

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

Сортировать по имени (1), возрасту (2), росту (3), весу (4): 2 женя 9 140 33 петя 10 130 35 дима 10 128 30 вася 11 135 39 

Можно не определять обычную функцию, а использовать lambda-функцию:

a = [['петя',10,130,35], ['вася',11,135,39], ['женя',9,140,33],['дима',10,128,30]] n = input('Сортировать по имени (1), возрасту (2), росту (3), весу (4): ') n = int(n)-1 a.sort(key=lambda i: i[n]) for i in a: print("%7s %3d %4d %3d" % (i[0],i[1],i[2],i[3]))

Кроме того, метод sort() имеет еще один необязательный параметр по ключевому слову — reverse . По умолчанию он равен False . Это значит, что сортировка происходит по возрастанию. Однако если у reverse будет значение True , то сортировка будет обратной, т. е. по убыванию. В измененной программе ниже реализована возможность выбора типа сортировки:

a = [['петя',10,130,35], ['вася',11,135,39], ['женя',9,140,33],['дима',10,128,30]] n = input('Сортировать по имени (1), возрасту (2), росту (3), весу (4): ') n = int(n)-1 t = input('По возрастанию (0), по убыванию (1): ') t = int(t) a.sort(key=lambda i: i[n], reverse=t) for i in a: print("%7s %3d %4d %3d" % (i[0],i[1],i[2],i[3]))

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

Сортировать по имени (1), возрасту (2), росту (3), весу (4): 4 По возрастанию (0), по убыванию (1): 1 вася 11 135 39 петя 10 130 35 женя 9 140 33 дима 10 128 30

Обратная сортировка списка в Python

Обратная сортировка списка в Python

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

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

Сортировка срезом списка

Срезы, а так же слайсинг, нарезка и индексирование — это несколько названий одного и того же. Я постараюсь называть это срезами.

Срезы — позволяет нам получать последовательность элементов/символов (в зависимости от типа данных) по описанному шаблону.

Мы можем использовать срезы для обратной сортировки списка.

spisok_slice = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] spisok_slice[::-1]
[10, 9, 8, 7, 6, 5, 4, 3, 2, 1]

Принцип работы среза

Срез принимает на вход 3 значения, их необходимо вводить в квадратные скобки

  • start — начальный элемент среза
  • stop — последний элемент среза
  • step — шаг среза

Не забываем, что отсчет элементов начинается с нуля

Отрицательные значения элементов используется для обратного порядка элементов

Если мы передадим в step -1 то получается, что мы вернем список в обратном порядке, от последнего значения к первому. Таким образом мы можем получить сортировку срезом.

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

Положительный индекс 0 1 2 3 4 5 6 7 8 9
Элемент списка 1 2 3 4 5 6 7 8 9 10
Отрицательный индекс -10 -9 -8 -7 -6 -5 -4 -3 -2 -1

Таблица положительных и отрицательных индексов в списке

Использование среза не изменяет исходный список, а только возвращает копию изменений.

Сортировка методом списка reverse

В Python есть встроенный метод списка reverse(). Он позволяет изменить сортировку в исходном списке.

spisok_reverse = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] spisok_reverse.reverse() print(spisok_reverse)
[10, 9, 8, 7, 6, 5, 4, 3, 2, 1]

Сортировка функцией reversed

В Python существует встроенная функция reversed, которая возвращает обратно-отсортированный список.

spisok_reversed = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] print(reversed(spisok_reversed))
[10, 9, 8, 7, 6, 5, 4, 3, 2, 1]

Сортировка функцией sorted

Казалось бы зачем столько, но все таки есть еще один вариант, использовать встроенную функцию sorted с флагом reverse=True

spisok_sorted = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] print(sorted(spisok_sorted, reverse=True))
[10, 9, 8, 7, 6, 5, 4, 3, 2, 1]

Заключение

В данной статье мы рассмотрели несколько вариантов обратной сортировки списка в Python, сортировка с помощью среза, сортировка с помощью метода списка reverse, сортировка с помощью функции reverse и сортировка с помощью функции sorted.

Надеюсь статья была для вас полезна.

Знаете другие способы обратной сортировки списков? Пишите в комментариях ��

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. Часть 9. Сортировка

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

Видео: Глеб Лиманский

Алгоритм Bubble Sort

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

Нравятся наши лекции? Поддержите нас
Ваше пожертвование поможет нам готовить еще больше выпусков Мастерской
Поддержать «Важные истории»

Этот метод по очереди сравнивает каждые два соседних элемента и переставляет их местами, если порядок неправильный. Например, возьмем следующий ряд чисел: 67381. Сначала алгоритм сравнит первые два соседних числа: 6 меньше 7, значит порядок правильный, они остаются на своих местах. Затем следующие два числа – 7 больше 3, значит они меняются местами. Затем он сравнит 7 и 8, и тоже переставит их местами и так далее. После первого прохода по ряду чисел в конце окажется самое большое число – 8. И дальше алгоритм проходит по всем числам снова и будет проходить столько раз, пока каждое число не встанет на свое место – от меньшего к большему.

Вот как это выглядит на языке Питон. Есть список с числами в рандомном порядке, который нужно отсортировать. Сперва сравним первые два числа и поменяем их местами, если порядок неправильный – то есть второе число больше первого. И попросим распечатать получившийся список.

Этот код сравнил 6 с 7, и оставил их на своих местах. Теперь сравним следующие два числа: меняем в коде индексы на 1 и 2. И видим, что он сравнил 3 и 7 и поменял их местами.

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

Этот код постепенно переместил 8 в конец, после одного обхода одно число нашло свое правильное место. Но на этом сортировка не заканчивается. Нам нужно, чтобы каждый элемент массива переместился на свое место – значит нужно сделать столько обходов, сколько у нас чисел. Поэтому мы создаем новый цикл с количеством итераций, равным длине списка. Но здесь мы увидим, что на последнем обходе ничего не поменяется, потому что когда 3 нашла свое место, самый минимальный элемент 1 тоже встал на свое место, значит мы можем отнять 1, чтобы не делать последний обход. Как еще можно оптимизировать этот код? После каждого обхода в конце списка оказывается наибольшее число, и сравнение тех чисел, которые уже нашли свое место, производить не надо. Поэтому мы можем отнять внутри цикла количество обходов, соответствующее итерации цикла – run. Тогда код не будет выполнять лишних операций сравнения.

Давайте теперь превратим наш алгоритм в функцию, которой можно будет передавать любые другие массивы. И протестируем ее на новом списке.

Встроенные методы и функции сортировки

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

Метод .sort() сортирует список и сохраняет его в отсортированном виде. А функция sorted() создает новый отсортированный список без изменения исходного.

Еще одно их отличие в том, что функция sorted работает не только со списками, но и другими объектами. Например, вот что получится, если мы отсортируем строку.

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

По умолчанию сортировка будет происходить по возрастанию, но мы можем передавать функции и методу параметры. За это отвечает параметр reverse. Если мы передадим ему параметр True, сортировка будет происходить по убыванию.

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

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

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

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

Теперь вы умеете сортировать данные с помощью Python. Тетрадку этого урока можно скачать на нашем GitHub.

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *