Reverse true python что это

Введение в Python

Поиск

Новое на сайте

Рейтинг результатов

Узнаем имя и результат пользователя:

Читаем содержимое файла и форматируем список content. В файле хранятся записи формата:

Позиция. Имя Результат

Reverse true python что это. python top scores before. Reverse true python что это фото. Reverse true python что это-python top scores before. картинка Reverse true python что это. картинка python top scores before

Список content генерируется следующим образом:

После этого, наша задача отсортировать весь список на основе результата. Для этого воспользуемся встроенной функцией sort.

reverse=True означает, что список будет форматироваться от большего к меньшему. В Python функция sort позволяется нам работать очень гибко, одним из параметров, которые она принимает, является ключевой аргумент key, которым мы можем задать функцию на основе которой будет производится сортировка. Давайте напишем такую функцию (обратите внимание, что функция должна быть определена до строки content.sort. ):

Готово! Список отсортирован. Теперь нужно перезаписать файл scores.txt, заполнив его десятью лучшими результатами. Для начала создадим переменную text:

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

Однако такой вариант это по сути лишняя трата процессорного времени и лишние строки в коде.

Напечтаем то, что у нас получилось, чтобы получить хоть какую-то визуализацию, и запишем переменную в файл:

Источник

Python: коллекции, часть 2/4: индексирование, срезы, сортировка

Часть 1Часть 2Часть 3Часть 4

Reverse true python что это. image loader. Reverse true python что это фото. Reverse true python что это-image loader. картинка Reverse true python что это. картинка image loaderДанная статья является продолжением моей статьи «Python: коллекции, часть 1: классификация, общие подходы и методы, конвертация».

В данной статье мы продолжим изучать общие принципы работы со стандартными коллекциями (модуль collections в ней не рассматривается) Python.

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

ОГЛАВЛЕНИЕ:

1. Индексирование

1.1 Индексированные коллекции

Рассмотрим индексированные коллекции (их еще называют последовательности — sequences) — список (list), кортеж (tuple), строку (string).

Под индексированностью имеется ввиду, что элементы коллекции располагаются в определённом порядке, каждый элемент имеет свой индекс от 0 (то есть первый по счёту элемент имеет индекс не 1, а 0) до индекса на единицу меньшего длины коллекции (т.е. len(mycollection)-1).

1.2 Получение значения по индексу

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

1.3 Изменение элемента списка по индексу

Поскольку кортежи и строки у нас неизменяемые коллекции, то по индексу мы можем только брать элементы, но не менять их:

А вот для списка, если взятие элемента по индексу располагается в левой части выражения, а далее идёт оператор присваивания =, то мы задаём новое значение элементу с этим индексом.

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

2 Срезы

2.1 Синтаксис среза

Очень часто, надо получить не один какой-то элемент, а некоторый их набор ограниченный определенными простыми правилами — например первые 5 или последние три, или каждый второй элемент — в таких задачах, вместо перебора в цикле намного удобнее использовать так называемый срез (slice, slicing).

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

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

Особенности среза:

Поэтому, например, mylist[::-1] не идентично mylist[:0:-1], так как в первом случае мы включим все элементы, а во втором дойдем до 0 индекса, но не включим его!

Примеры срезов в виде таблицы:

Reverse true python что это. image loader. Reverse true python что это фото. Reverse true python что это-image loader. картинка Reverse true python что это. картинка image loader

2.2. Именованные срезы

Чтобы избавится от «магических констант», особенно в случае, когда один и тот же срез надо применять многократно, можно задать константы с именованными срезами с пользованием специальной функции slice()()

Примечание: Nonе соответствует опущенному значению по-умолчанию. То есть [:2] становится slice(None, 2), а [1::2] становится slice(1, None, 2).

2.3 Изменение списка срезом

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

Проиллюстрируем это на примерах ниже:

2.4 Выход за границы индекса

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

Обращение к несуществующему индексу коллекции вызывает ошибку:

А в случае выхода границ среза за границы коллекции никакой ошибки не происходит:

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

3 Сортировка элементов коллекции

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

3.1 Функция sorted()

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

Пример сортировки списка строк по длине len() каждого элемента:

3.2 Функция reversed()

Функция reversed() применяется для последовательностей и работает по другому:

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

3.4 Особенности сортировки словаря

В сортировке словаря есть свои особенности, вызванные тем, что элемент словаря — это пара ключ: значение.

UPD: Так же, не забываем, что говоря о сортировке словаря, мы имеем ввиду сортировку полученных из словаря данных для вывода или сохранения в индексированную коллекцию. Сохранить данные сортированными в самом стандартном словаре не получится, они в нем, как и других неиндексированных коллекциях находятся в произвольном порядке.

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

Для решения этой задачи можно в качестве специальной функции сортировки передавать lambda-функцию lambda x: x[1] которая из получаемых на каждом этапе кортежей (ключ, значение) будет брать для сортировки второй элемент кортежа.

UPD от ShashkovS: 3.5 Дополнительная информация по использованию параметра key при сортировке

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

Перед тем, как сравнивать два элемента списка к ним применялась функция prepare_item, которая меняла знак у стоимости (функция применяется ровно по одному разу к каждому элементу. В результате при одинаковом первом значении сортировка по второму происходила в обратном порядке.

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

UPD от ShashkovS: 3.6 Устойчивость сортировки

Допустим данные нужно отсортировать сначала по столбцу А по возрастанию, затем по столбцу B по убыванию, и наконец по столбцу C снова по возрастанию.

Если данные в столбце B числовые, то при помощи подходящей функции в key можно поменять знак у элементов B, что приведёт к необходимому результату.
А если все данные текстовые? Тут есть такая возможность.
Дело в том, что сортировка sort в Python устойчивая (начиная с Python 2.2), то есть она не меняет порядок «одинаковых» элементов.

Поэтому можно просто отсортировать три раза по разным ключам:

Источник

Функции сортировки sort и sorted

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

для всех остальных типов коллекций. Давайте вначале посмотрим на отличие в их вызовах. Если у нас имеется какой-либо упорядоченный список:

то этот объект имеет встроенный метод sort, который меняет его состояние и расставляет элементы по возрастанию:

Получим измененный список:

А вот коллекции кортежи или строки:

не имеют такого встроенного метода и попытка их отсортировать, записав:

приведет к ошибке. Для их сортировки как раз и можно воспользоваться второй функцией sorted:

на выходе получим упорядоченный список

Обратите внимание, чтобы мы не передавали в качестве аргумента функции sorted, на выходе будем получать именно список отсортированных данных. В данном случае передаем кортеж, а получаем – список.

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

Причем, эта функция не меняет исходные коллекции b и c, она возвращает новый список с отсортированными данными. В то время как метод sort для списка меняет этот список. Вот на это следует также обращать внимание. То есть, если нам нужно сохранить результат сортировки в переменной, это делается так:

и res будет ссылаться на список:

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

отсортировать не получится:

возникнет ошибка, что строку нельзя сравнивать с числом. И то же самое с функцией sorted:

Если уберем последний элемент:

то все будет работать:

И этот пример также показывает, что список можно сортировать и с помощью метода sort и с помощью функции sorted. Разница только в том, что метод sort не создает новой коллекции, а меняет уже существующую. Функция же sorted не меняет исходную коллекцию, а создает новую с отсортированными элементами. Поэтому, для изменения коллекции a здесь следует записывать такую конструкцию:

Оба этих подхода к сортировке поддерживают необязательный параметр

который определяет порядок сортировки: по возрастанию (False) или по убыванию (True). По умолчанию стоит значение reverse=False. Если мы запишем его вот так:

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

И то же самое с методом sort:

Своя сортирующая функция

Язык Python позволяет создавать свои сортирующие функции для более точной настройки алгоритма сортировки. Давайте для начала рассмотрим такой пример. Пусть у нас имеется вот такой список:

и мы хотим, чтобы вначале стояли четные элементы, а в конце – нечетные. Для этого создадим такую вспомогательную функцию:

И укажем ее при сортировке:

Мы здесь используем именованный параметр key, который принимает ссылку на сортирующую функцию. Запускаем программу и видим следующий результат:

Разберемся, почему так произошло. Смотрите, функция funcSort возвращает вот такие значения для каждого элемента списка a:

Reverse true python что это. image001. Reverse true python что это фото. Reverse true python что это-image001. картинка Reverse true python что это. картинка image001

И, далее, в sorted уже используются именно эти значения для сортировки элементов по возрастанию. То есть, сначала, по порядку берется элемент со значением 4, затем, 6 и потом 2. После этого следуют нечетные значения в порядке их следования: 1, 3, 5. В результате мы получаем список:

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

Здесь четные значения возвращаются такими как они есть, а к нечетным прибавляем 100. В результате получим:

Reverse true python что это. image002. Reverse true python что это фото. Reverse true python что это-image002. картинка Reverse true python что это. картинка image002

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

Конечно, здесь вместо определения своей функции можно также записывать анонимные функции, например:

Получим ранее рассмотренный результат:

Или, то же самое можно делать и со строками:

Отсортируем их по длине строки:

[‘Тверь’, ‘Псков’, ‘Москва’, ‘Рязань’, ‘Смоленск’]

Или по последнему символу, используя лексикографический порядок:

[‘Москва’, ‘Псков’, ‘Смоленск’, ‘Тверь’, ‘Рязань’]

Или, по первому символу:

[‘Москва’, ‘Псков’, ‘Рязань’, ‘Смоленск’, ‘Тверь’]

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

И нам нужно его отсортировать по возрастанию цены (последнее значение). Это можно сделать так:

На выходе получим список:

[(‘Мертвые души’, ‘Гоголь Н.В.’, 190), (‘Евгений Онегин’, ‘Пушкин А.С.’, 200), (‘Муму’, ‘Тургенев И.С.’, 250), (‘Мастер и Маргарита’, ‘Булгаков М.А.’, 500)]

Вот так можно выполнять сортировку данных в Python.

Задания для самоподготовки

1. Используя сортировку, найдите первые три наименьшие значения в списке:

Сам список должен оставаться неизменным.

2. Отсортируйте список:

так, чтобы сначала шли отрицательные числа, а затем, положительные.

3. Пусть имеется словарь:

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

Видео по теме

Reverse true python что это. default. Reverse true python что это фото. Reverse true python что это-default. картинка Reverse true python что это. картинка default

#1. Первое знакомство с Python Установка на компьютер

Reverse true python что это. default. Reverse true python что это фото. Reverse true python что это-default. картинка Reverse true python что это. картинка default

#2. Варианты исполнения команд. Переходим в PyCharm

Reverse true python что это. default. Reverse true python что это фото. Reverse true python что это-default. картинка Reverse true python что это. картинка default

#3. Переменные, оператор присваивания, функции type и id

Reverse true python что это. default. Reverse true python что это фото. Reverse true python что это-default. картинка Reverse true python что это. картинка default

#4. Числовые типы, арифметические операции

Reverse true python что это. default. Reverse true python что это фото. Reverse true python что это-default. картинка Reverse true python что это. картинка default

#5. Математические функции и работа с модулем math

Reverse true python что это. default. Reverse true python что это фото. Reverse true python что это-default. картинка Reverse true python что это. картинка default

#6. Функции print() и input(). Преобразование строк в числа int() и float()

Reverse true python что это. default. Reverse true python что это фото. Reverse true python что это-default. картинка Reverse true python что это. картинка default

#7. Логический тип bool. Операторы сравнения и операторы and, or, not

Reverse true python что это. default. Reverse true python что это фото. Reverse true python что это-default. картинка Reverse true python что это. картинка default

#8. Введение в строки. Базовые операции над строками

Reverse true python что это. default. Reverse true python что это фото. Reverse true python что это-default. картинка Reverse true python что это. картинка default

#9. Знакомство с индексами и срезами строк

Reverse true python что это. default. Reverse true python что это фото. Reverse true python что это-default. картинка Reverse true python что это. картинка default

#10. Основные методы строк

Reverse true python что это. default. Reverse true python что это фото. Reverse true python что это-default. картинка Reverse true python что это. картинка default

#11. Спецсимволы, экранирование символов, row-строки

Reverse true python что это. default. Reverse true python что это фото. Reverse true python что это-default. картинка Reverse true python что это. картинка default

#12. Форматирование строк: метод format и F-строки

Reverse true python что это. default. Reverse true python что это фото. Reverse true python что это-default. картинка Reverse true python что это. картинка default

Reverse true python что это. default. Reverse true python что это фото. Reverse true python что это-default. картинка Reverse true python что это. картинка default

#14. Срезы списков и сравнение списков

Reverse true python что это. default. Reverse true python что это фото. Reverse true python что это-default. картинка Reverse true python что это. картинка default

#15. Основные методы списков

Reverse true python что это. default. Reverse true python что это фото. Reverse true python что это-default. картинка Reverse true python что это. картинка default

#16. Вложенные списки, многомерные списки

Reverse true python что это. default. Reverse true python что это фото. Reverse true python что это-default. картинка Reverse true python что это. картинка default

#17. Условный оператор if. Конструкция if-else

Reverse true python что это. default. Reverse true python что это фото. Reverse true python что это-default. картинка Reverse true python что это. картинка default

#18. Вложенные условия и множественный выбор. Конструкция if-elif-else

Reverse true python что это. default. Reverse true python что это фото. Reverse true python что это-default. картинка Reverse true python что это. картинка default

#19. Тернарный условный оператор. Вложенное тернарное условие

Reverse true python что это. default. Reverse true python что это фото. Reverse true python что это-default. картинка Reverse true python что это. картинка default

#20. Оператор цикла while

Reverse true python что это. default. Reverse true python что это фото. Reverse true python что это-default. картинка Reverse true python что это. картинка default

#21. Операторы циклов break, continue и else

Reverse true python что это. default. Reverse true python что это фото. Reverse true python что это-default. картинка Reverse true python что это. картинка default

#22. Оператор цикла for. Функция range()

Reverse true python что это. default. Reverse true python что это фото. Reverse true python что это-default. картинка Reverse true python что это. картинка default

#23. Примеры работы оператора цикла for. Функция enumerate()

Reverse true python что это. default. Reverse true python что это фото. Reverse true python что это-default. картинка Reverse true python что это. картинка default

#24. Итератор и итерируемые объекты. Функции iter() и next()

Reverse true python что это. default. Reverse true python что это фото. Reverse true python что это-default. картинка Reverse true python что это. картинка default

#25. Вложенные циклы. Примеры задач с вложенными циклами

Reverse true python что это. default. Reverse true python что это фото. Reverse true python что это-default. картинка Reverse true python что это. картинка default

#26. Треугольник Паскаля как пример работы вложенных циклов

Reverse true python что это. default. Reverse true python что это фото. Reverse true python что это-default. картинка Reverse true python что это. картинка default

#27. Генераторы списков (List comprehensions)

Reverse true python что это. default. Reverse true python что это фото. Reverse true python что это-default. картинка Reverse true python что это. картинка default

#28. Вложенные генераторы списков

Reverse true python что это. default. Reverse true python что это фото. Reverse true python что это-default. картинка Reverse true python что это. картинка default

#29. Введение в словари (dict). Базовые операции над словарями

Reverse true python что это. default. Reverse true python что это фото. Reverse true python что это-default. картинка Reverse true python что это. картинка default

#30. Методы словаря, перебор элементов словаря в цикле

Reverse true python что это. default. Reverse true python что это фото. Reverse true python что это-default. картинка Reverse true python что это. картинка default

#31. Кортежи (tuple) и их методы

Reverse true python что это. default. Reverse true python что это фото. Reverse true python что это-default. картинка Reverse true python что это. картинка default

#32. Множества (set) и их методы

Reverse true python что это. default. Reverse true python что это фото. Reverse true python что это-default. картинка Reverse true python что это. картинка default

#33. Операции над множествами, сравнение множеств

Reverse true python что это. default. Reverse true python что это фото. Reverse true python что это-default. картинка Reverse true python что это. картинка default

#34. Генераторы множеств и генераторы словарей

Reverse true python что это. default. Reverse true python что это фото. Reverse true python что это-default. картинка Reverse true python что это. картинка default

#35. Функции: первое знакомство, определение def и их вызов

Reverse true python что это. default. Reverse true python что это фото. Reverse true python что это-default. картинка Reverse true python что это. картинка default

#36. Оператор return в функциях. Функциональное программирование

Reverse true python что это. default. Reverse true python что это фото. Reverse true python что это-default. картинка Reverse true python что это. картинка default

#37. Алгоритм Евклида для нахождения НОД

Reverse true python что это. default. Reverse true python что это фото. Reverse true python что это-default. картинка Reverse true python что это. картинка default

#38. Именованные аргументы. Фактические и формальные параметры

Reverse true python что это. default. Reverse true python что это фото. Reverse true python что это-default. картинка Reverse true python что это. картинка default

#39. Функции с произвольным числом параметров *args и **kwargs

Reverse true python что это. default. Reverse true python что это фото. Reverse true python что это-default. картинка Reverse true python что это. картинка default

#40. Операторы * и ** для упаковки и распаковки коллекций

Reverse true python что это. default. Reverse true python что это фото. Reverse true python что это-default. картинка Reverse true python что это. картинка default

#41. Рекурсивные функции

Reverse true python что это. default. Reverse true python что это фото. Reverse true python что это-default. картинка Reverse true python что это. картинка default

#42. Анонимные (lambda) функции

Reverse true python что это. default. Reverse true python что это фото. Reverse true python что это-default. картинка Reverse true python что это. картинка default

#43. Области видимости переменных. Ключевые слова global и nonlocal

Reverse true python что это. default. Reverse true python что это фото. Reverse true python что это-default. картинка Reverse true python что это. картинка default

#44. Замыкания в Python

Reverse true python что это. default. Reverse true python что это фото. Reverse true python что это-default. картинка Reverse true python что это. картинка default

#45. Введение в декораторы функций

Reverse true python что это. default. Reverse true python что это фото. Reverse true python что это-default. картинка Reverse true python что это. картинка default

#46. Декораторы с параметрами. Сохранение свойств декорируемых функций

Reverse true python что это. default. Reverse true python что это фото. Reverse true python что это-default. картинка Reverse true python что это. картинка default

#47. Импорт стандартных модулей. Команды import и from

Reverse true python что это. default. Reverse true python что это фото. Reverse true python что это-default. картинка Reverse true python что это. картинка default

#48. Импорт собственных модулей

Reverse true python что это. default. Reverse true python что это фото. Reverse true python что это-default. картинка Reverse true python что это. картинка default

#49. Установка сторонних модулей (pip install). Пакетная установка

Reverse true python что это. default. Reverse true python что это фото. Reverse true python что это-default. картинка Reverse true python что это. картинка default

#50. Пакеты (package) в Python. Вложенные пакеты

Reverse true python что это. default. Reverse true python что это фото. Reverse true python что это-default. картинка Reverse true python что это. картинка default

#51. Функция open. Чтение данных из файла

Reverse true python что это. default. Reverse true python что это фото. Reverse true python что это-default. картинка Reverse true python что это. картинка default

#52. Исключение FileNotFoundError и менеджер контекста (with) для файлов

Reverse true python что это. default. Reverse true python что это фото. Reverse true python что это-default. картинка Reverse true python что это. картинка default

#53. Запись данных в файл в текстовом и бинарном режимах

Reverse true python что это. default. Reverse true python что это фото. Reverse true python что это-default. картинка Reverse true python что это. картинка default

#54. Выражения генераторы

Reverse true python что это. default. Reverse true python что это фото. Reverse true python что это-default. картинка Reverse true python что это. картинка default

#55. Функция-генератор. Оператор yield

Reverse true python что это. default. Reverse true python что это фото. Reverse true python что это-default. картинка Reverse true python что это. картинка default

#56. Функция map. Примеры ее использования

Reverse true python что это. default. Reverse true python что это фото. Reverse true python что это-default. картинка Reverse true python что это. картинка default

#57. Функция filter для отбора значений итерируемых объектов

Reverse true python что это. default. Reverse true python что это фото. Reverse true python что это-default. картинка Reverse true python что это. картинка default

#58. Функция zip. Примеры использования

Reverse true python что это. default. Reverse true python что это фото. Reverse true python что это-default. картинка Reverse true python что это. картинка default

#59. Сортировка с помощью метода sort и функции sorted

Reverse true python что это. default. Reverse true python что это фото. Reverse true python что это-default. картинка Reverse true python что это. картинка default

#60. Аргумент key для сортировки коллекций по ключу

Reverse true python что это. default. Reverse true python что это фото. Reverse true python что это-default. картинка Reverse true python что это. картинка default

#61. Функции isinstance и type для проверки типов данных

Reverse true python что это. default. Reverse true python что это фото. Reverse true python что это-default. картинка Reverse true python что это. картинка default

#62. Функции all и any. Примеры их использования

Reverse true python что это. default. Reverse true python что это фото. Reverse true python что это-default. картинка Reverse true python что это. картинка default

#63. Расширенное представление чисел. Системы счисления

Reverse true python что это. default. Reverse true python что это фото. Reverse true python что это-default. картинка Reverse true python что это. картинка default

#64. Битовые операции И, ИЛИ, НЕ, XOR. Сдвиговые операторы

Reverse true python что это. default. Reverse true python что это фото. Reverse true python что это-default. картинка Reverse true python что это. картинка default

#65. Модуль random стандартной библиотеки

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

Источник

Sorting HOW TO¶

Andrew Dalke and Raymond Hettinger

Python lists have a built-in list.sort() method that modifies the list in-place. There is also a sorted() built-in function that builds a new sorted list from an iterable.

In this document, we explore the various techniques for sorting data using Python.

Sorting Basics¶

A simple ascending sort is very easy: just call the sorted() function. It returns a new sorted list:

Another difference is that the list.sort() method is only defined for lists. In contrast, the sorted() function accepts any iterable.

Key Functions¶

Both list.sort() and sorted() have a key parameter to specify a function (or other callable) to be called on each list element prior to making comparisons.

For example, here’s a case-insensitive string comparison:

The value of the key parameter should be a function (or other callable) that takes a single argument and returns a key to use for sorting purposes. This technique is fast because the key function is called exactly once for each input record.

A common pattern is to sort complex objects using some of the object’s indices as keys. For example:

The same technique works for objects with named attributes. For example:

Operator Module Functions¶

Using those functions, the above examples become simpler and faster:

The operator module functions allow multiple levels of sorting. For example, to sort by grade then by age:

Ascending and Descending¶

Both list.sort() and sorted() accept a reverse parameter with a boolean value. This is used to flag descending sorts. For example, to get the student data in reverse age order:

Sort Stability and Complex Sorts¶

Sorts are guaranteed to be stable. That means that when multiple records have the same key, their original order is preserved.

This wonderful property lets you build complex sorts in a series of sorting steps. For example, to sort the student data by descending grade and then ascending age, do the age sort first and then sort again using grade:

This can be abstracted out into a wrapper function that can take a list and tuples of field and order to sort them on multiple passes.

The Timsort algorithm used in Python does multiple sorts efficiently because it can take advantage of any ordering already present in a dataset.

The Old Way Using Decorate-Sort-Undecorate¶

This idiom is called Decorate-Sort-Undecorate after its three steps:

First, the initial list is decorated with new values that control the sort order.

Second, the decorated list is sorted.

Finally, the decorations are removed, creating a list that contains only the initial values in the new order.

For example, to sort the student data by grade using the DSU approach:

This idiom works because tuples are compared lexicographically; the first items are compared; if they are the same then the second items are compared, and so on.

It is not strictly necessary in all cases to include the index i in the decorated list, but including it gives two benefits:

The sort is stable – if two items have the same key, their order will be preserved in the sorted list.

The original items do not have to be comparable because the ordering of the decorated tuples will be determined by at most the first two items. So for example the original list could contain complex numbers which cannot be sorted directly.

Another name for this idiom is Schwartzian transform, after Randal L. Schwartz, who popularized it among Perl programmers.

Now that Python sorting provides key-functions, this technique is not often needed.

The Old Way Using the cmp Parameter¶

Many constructs given in this HOWTO assume Python 2.4 or later. Before that, there was no sorted() builtin and list.sort() took no keyword arguments. Instead, all of the Py2.x versions supported a cmp parameter to handle user specified comparison functions.

In Py3.0, the cmp parameter was removed entirely (as part of a larger effort to simplify and unify the language, eliminating the conflict between rich comparisons and the __cmp__() magic method).

In Py2.x, sort allowed an optional function which can be called for doing the comparisons. That function should take two arguments to be compared and then return a negative value for less-than, return zero if they are equal, or return a positive value for greater-than. For example, we can do:

Or you can reverse the order of comparison with:

When porting code from Python 2.x to 3.x, the situation can arise when you have the user supplying a comparison function and you need to convert that to a key function. The following wrapper makes that easy to do:

To convert to a key function, just wrap the old comparison function:

In Python 3.2, the functools.cmp_to_key() function was added to the functools module in the standard library.

Odd and Ends¶

For locale aware sorting, use locale.strxfrm() for a key function or locale.strcoll() for a comparison function.

The reverse parameter still maintains sort stability (so that records with equal keys retain the original order). Interestingly, that effect can be simulated without the parameter by using the builtin reversed() function twice:

The sort routines are guaranteed to use __lt__() when making comparisons between two objects. So, it is easy to add a standard sort order to a class by defining an __lt__() method:

Key functions need not depend directly on the objects being sorted. A key function can also access external resources. For instance, if the student grades are stored in a dictionary, they can be used to sort a separate list of student names:

Источник

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

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