Сортировка списков в Python
В Python данные можно сортировать с помощью методов sorted() или sort() . В этой статье мы поговорим о том, как работает сортировка списков в Python. Разберем примеры кода для методов sorted() и sort() и посмотрим, чем они отличаются.
Что такое метод sort() в Python?
Этот метод берет список и сортирует его. То есть на выходе мы получаем тот же список, только отсортированный. Этот метод не возвращает никакого значения.
В этом примере у нас есть список чисел, и мы можем использовать метод sort() для сортировки списка в порядке возрастания.
my_list = [67, 2, 999, 1, 15] # Выводим неупорядоченный список: print("Unordered list: ", my_list) # Сортировка списка my_list.sort() # Выводим упорядоченный список print("Ordered list: ", my_list)
Выполним наш код и получим следующий результат:
Unordered list: [67, 2, 999, 1, 15] Ordered list: [1, 2, 15, 67, 999]
Однако если список уже отсортирован, то мы получим None.
my_list = [6, 7, 8, 9, 10] # Это строка вернет None, потому что список уже отсортирован print(my_list.sort())
Метод sort() может принимать два необязательных аргумента: key и reverse .
Значением key выступает функция, которая будет вызываться для каждого элемента в списке.
От редакции Pythonist. О функциях и их аргументах у нас есть отдельная статья — «Функции и их аргументы в Python 3».
В следующем примере давайте используем функцию len() в качестве значения аргумента key. Таким образом, key=len скажет компьютеру отсортировать список имен по длине, от наименьшего к наибольшему.
names = ["Jessica", "Ben", "Carl", "Jackie", "Wendy"] print("Unsorted: ", names) names.sort(key=len) print("Sorted: ", names)
Вот, что мы получим:
Unsorted: ['Jessica', 'Ben', 'Carl', 'Jackie', 'Wendy'] Sorted: ['Ben', 'Carl', 'Wendy', 'Jackie', 'Jessica']
Аргумент reverse может иметь логическое значение: True (Истина) или False (Ложь).
В следующем примере reverse=True укажет компьютеру отсортировать список в обратном алфавитном порядке.
names = ["Jessica", "Ben", "Carl", "Jackie", "Wendy"] print("Unsorted: ", names) names.sort(reverse=True) print("Sorted: ", names) # Результат: # Unsorted: ['Jessica', 'Ben', 'Carl', 'Jackie', 'Wendy'] # Sorted: ['Wendy', 'Jessica', 'Jackie', 'Carl', 'Ben']
[python_ad_block]
Как использовать метод sorted() в Python
Этот метод превращает итерируемый объект в отсортированный список. Итерируемыми объектами могут быть списки, строки и кортежи.
Одно из ключевых различий между sort() и sorted() заключается в том, что sorted() вернет новый список, а sort() сортирует уже имеющийся.
В следующем примере у нас есть список чисел, который нужно отсортировать в порядке возрастания.
sorted_numbers = sorted([77, 22, 9, -6, 4000]) print("Sorted in ascending order: ", sorted_numbers) # Результат: # Sorted in ascending order: [-6, 9, 22, 77, 4000]
Метод sorted() тоже принимает необязательные аргументы. Они такие же, как и у sort() : key и reverse .
Давайте разберем следующий пример. У нас есть список чисел. Пропишем необязательный аргумент reverse=True . Он укажет компьютеру отсортировать список от наибольшего числа к наименьшему.
sorted_numbers = sorted([77, 22, 9, -6, 4000], reverse=True) print("Sorted in descending order: ", sorted_numbers) # Результат: # Sorted in descending order: [4000, 77, 22, 9, -6]
Метод sorted() для других типов данных
Еще одно ключевое различие между sorted() и sort() заключается в том, что метод sorted() принимает любые итерируемые объекты (списки, строки, кортежи и т.д.), тогда как метод sort() работает только со списками.
Давайте разобьём строку на отдельные слова с помощью метода split() , а затем используем метод sorted() для сортировки слов по длине от наименьшего к наибольшему.
my_sentence = "Jessica found a dollar on the ground" # Вывод оригинального предложения: print("Original sentence: ", my_sentence) # Вывод отсортированного списка слов: print(sorted(my_sentence.split(), key=len)) # Результат: # Original sentence: Jessica found a dollar on the ground # ['a', 'on', 'the', 'found', 'dollar', 'ground', 'Jessica']
А теперь давайте чуть изменим наш пример. Добавим необязательный аргумент reverse . Благодаря этому список будет отсортирован в обратном порядке, от самого длинного слова к самому короткому.
my_sentence = "Jessica found a dollar on the ground" print("Original sentence: ", my_sentence) print(sorted(my_sentence.split(), key=len, reverse=True)) # Результат: # Original sentence: Jessica found a dollar on the ground # ['Jessica', 'dollar', 'ground', 'found', 'the', 'on', 'a']
Мы также можем использовать метод sorted() и для кортежей.
В этом примере у нас есть набор кортежей, которые представляют имя, возраст и музыкальный инструмент учащихся какой-то группы.
band_students = [ ('Danny', 17, 'Trombone'), ('Mary', 14, 'Flute'), ('Josh', 15, 'Percussion') ]
Мы можем использовать метод sorted() для сортировки этих данных по возрасту учащегося. Аргумент key будет иметь значение лямбда-функции, которая сообщает компьютеру о сортировке по возрасту в порядке возрастания.
Лямбда-функция – это анонимная функция. Этот тип функции можно определить с помощью ключевого слова lambda .
Итак, напишем следующую лямбду-функцию, которая будет говорить нашей программе, что отсортировать мы хотим именно по возрасту:
lambda student: student[1]
Чтобы получить доступ к значению в кортеже, мы используем квадратные скобки [] и индекс элемента в кортеже, к которому хотим получить доступ. Поскольку в Python отсчет идет с нуля, возраст у нас будет под индексом [1] .
Таким образом, мы получаем следующий код:
band_students = [ ('Danny', 17, 'Trombone'), ('Mary', 14, 'Flute'), ('Josh', 15, 'Percussion') ] print(sorted(band_students, key=lambda student: student[1])) # Результат: # [('Mary', 14, 'Flute'), ('Josh', 15, 'Percussion'), ('Danny', 17, 'Trombone')]
Мы можем изменить этот пример. Давайте отсортируем кортежи по названиям музыкальных инструментов. Более того, давайте используем reverse=True для сортировки инструментов в обратном алфавитном порядке.
band_students = [ ('Danny', 17, 'Trombone'), ('Mary', 14, 'Flute'), ('Josh', 15, 'Percussion') ] print(sorted(band_students, key=lambda student: student[2], reverse=True)) # Результат: # [('Danny', 17, 'Trombone'), ('Josh', 15, 'Percussion'), ('Mary', 14, 'Flute')]
Заключение
В этой статье мы разобрали, как работает сортировка списков в Python. Узнали, как работать с такими методами, как sort() и sorted() , и в чем их различия.
Метод sort() работает только со списками и сортирует уже имеющийся список. Данный метод ничего не возвращает.
А метод sorted() работает с любыми итерируемыми объектами и возвращает новый отсортированный список. В качестве итерируемых объектов могут выступать списки, строки, кортежи и другие.
У обоих этих методов есть два необязательных аргумента: key и reverse .
Значением аргумента key может быть функция. Она будет вызываться для каждого элемента в списке. По этой функции, собственно, и будет проводиться сортировка.
Значением аргумента reverse может быть True или False .
Надеемся, эта статья была для вас полезна. Успехов в написании кода!
Функция sorted() в Python, выполняет сортировку
Выполняет сортировку последовательности по возростанию/убыванию
Синтаксис:
sorted(iterable, *, key=None, reverse=False)
Параметры:
- iterable — объект, поддерживающий итерирование;
- key=None — должна быть функция (принимает один аргумент), которая применяется к каждому элементу последовательности;
- reverse=False — порядок сортировки;
Возвращаемое значение:
- отсортированный список
Описание:
Функция sorted() вернет новый отсортированный [список]t-list] из итерируемых элементов. Функция имеет два необязательных аргумента, которые должны быть указаны в качестве аргументов ключевых слов.
Аргумент key принимает функцию, например key=str.lower . Переданная функция вычисляет результат для каждого элемента последовательности, который используется для сравнения элементов при сортировке. Значением по умолчанию является None , т.е. сравнивать элементы напрямую (как есть).
Аргумент reverse=False имеет логическое значение. Если установлено значение True , то элементы списка сортируются в обратной последовательности (по убыванию).
Используйте functools.cmp_to_key() для преобразования функции, использующей cmp (старый стиль) в использующую key (новый стиль).
Встроенная функция sorted() является гарантированно стабильной. Это означает, что когда несколько элементов последовательности имеют равные значения, их первоначальный порядок сохраняется. Такое поведение полезно при сортировке в несколько проходов.
Примеры различных способов сортировки последовательностей.
Сортировка слов в предложении без учета регистра:
line = 'This is a test string from Andrew' x = sorted(line.split(), key=str.lower) print(x) # ['a', 'Andrew', 'from', 'is', 'string', 'test', 'This']
Сортировка сложных объектов с использованием индексов в качестве ключей key :
student = [ ('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10), ] # Сортируем по возрасту student[2] x = sorted(student, key=lambda student: student[2]) print(x) # [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
Тот же метод работает для объектов с именованными атрибутами.
class Student: def __init__(self, name, grade, age): self.name = name self.grade = grade self.age = age def __repr__(self): return repr((self.name, self.grade, self.age)) student = [ Student('john', 'A', 15), Student('jane', 'B', 12), Student('dave', 'B', 10), ] x = sorted(student, key=lambda student: student.age) print(x) # [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
Сортировка по убыванию:
student = [ ('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10), ] # Сортируем по убыванию возраста student[2] x = sorted(student, key=lambda i: i[2], reverse=True) print(x) # [('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]
Стабильность сортировки и сложные сортировки:
data = [('red', 1), ('blue', 1), ('red', 2), ('blue', 2)] x = sorted(data, key=lambda data: data[0]) print(x) # [('blue', 1), ('blue', 2), ('red', 1), ('red', 2)]
Обратите внимание, как две записи (‘blue’, 1), (‘blue’, 2) для синего цвета сохраняют свой первоначальный порядок.
Это замечательное свойство позволяет создавать сложные сортировки за несколько проходов по нескольким ключам. Например, чтобы отсортировать данные учащиеся по возрастанию успеваемости, а затем по убыванию возраста. Успеваемость будет первым ключом, возраст вторым.
student = [ ('john', 15, 4.1), ('jane', 12, 4.9), ('dave', 10, 3.9), ('kate', 11, 4.1), ] # По средней оценке x = sorted(student, key=lambda num: num[2]) # По убыванию возраста y = sorted(x, key=lambda age: age[1], reverse=True) print(y) # [('john', 15, 4.1), ('jane', 12, 4.9), ('kate', 11, 4.1), ('dave', 10, 3.9)]
А еще, для сортировок по нескольким ключам, удобнее использовать модуль operator . Функции модуля operator допускают несколько уровней сортировки. Например, как в предыдущем примере успеваемость будет первым ключом, возраст вторым.
Только сортировать будем все по возрастанию:
from operator import itemgetter x = sorted(student, key=itemgetter(2,1)) print(x) # [('dave', 10, 3.9), ('kate', 11, 4.1), ('john', 15, 4.1), ('jane', 12, 4.9)]
- ОБЗОРНАЯ СТРАНИЦА РАЗДЕЛА
- Функция abs(), абсолютное значение числа
- Функция all(), все элементы True
- Функция any(), хотя бы один элемент True
- Функция ascii(), преобразует строку в ASCII
- Функция bin(), число в двоичную строку
- Класс bool(), логическое значение объекта
- Функция breakpoint(), отладчик кода
- Класс bytearray(), преобразует в массив байтов
- Класс bytes(), преобразует в строку байтов
- Функция callable(), проверяет можно ли вызвать объект
- Функция chr(), число в символ Юникода
- Класс classmethod, делает функцию методом класса
- Функция compile() компилирует блок кода Python
- Класс complex(), преобразует в комплексное число
- Функция delattr(), удаляет атрибут объекта
- Класс dict() создает словарь
- Функция dir(), все атрибуты объекта
- Функция divmod(), делит числа с остатком
- Функция enumerate(), счетчик элементов последовательности
- Функция eval(), выполняет строку-выражение с кодом
- Функция exec(), выполняет блок кода
- Функция filter(), фильтрует список по условию
- Класс float(), преобразует в вещественное число
- Функция format(), форматирует значение переменной
- Класс frozenset(), преобразует в неизменяемое множество
- Функция getattr(), значение атрибута по имени
- Функция globals(), переменные глобальной области
- Функция hasattr(), наличие атрибута объекта
- Функция hash(), хэш-значение объекта
- Функция help(), справка по любому объекту
- Функция hex(), число в шестнадцатеричную строку
- Функция id(), идентификатор объекта
- Функция input(), ввод данных с клавиатуры
- Класс int(), преобразует в тип int
- Функция isinstance(), принадлежность экземпляра к классу
- Функция issubclass(), проверяет наследование класса
- Функция iter(), создает итератор
- Функция len(), количество элементов объекта
- Класс list(), преобразовывает в список
- Функция locals(), переменные локальной области
- Функция map(), обработка последовательности без цикла
- Функция max(), максимальное значение элемента
- Класс memoryview(), ссылка на буфер обмена
- Функция min(), минимальное значение элемента
- Функция next(), следующий элемент итератора
- Класс object(), возвращает безликий объект
- Функция oct(), число в восьмеричную строку
- Функция open(), открывает файл на чтение/запись
- Функция ord(), число символа Unicode
- Функция pow(), возводит число в степень
- Функция print(), печатает объект
- Класс property(), метод класса как свойство
- Класс range(), генерирует арифметические последовательности
- Функция repr(), описание объекта
- Функция reversed(), разворачивает последовательность
- Функция round(), округляет число
- Класс set(), создает или преобразовывает в множество
- Функция setattr(), создает атрибут объекта
- Класс slice(), шаблон среза
- Функция sorted(), выполняет сортировку
- Декоратор staticmethod(), метод класса в статический метод
- Класс str(), преобразует объект в строку
- Функция sum(), сумма последовательности
- Функция super(), доступ к унаследованным методам
- Класс tuple(), создает или преобразует в кортеж
- Класс type(), возвращает тип объекта
- Функция vars(), словарь переменных объекта
- Функция zip(), объединить элементы в список кортежей
- Функция __import__(), находит и импортирует модуль
- Функция aiter(), создает асинхронный итератор
- Функция anext(), следующий элемент асинхронного итератора
Difference Between Sort and Sorted in Python

Python language supports two built-in methods to perform the sorting operation on any sequence.
These two methods are given below:
The sort() function returns nothing and changes the original sequence, while the sorted() function creates a new sequence type containing a sorted version of the given sequence.
Let’s discuss the above two methods of our topic difference between sort and sorted in Python in detail.
sort() function in Python
- The sort() function is used to perform the sorting operation, like the Sorted Function, but is very different in terms of its uses.
- The sort() function is a list method, i.e., it can only be used to sort a list.
- The sort() function returns nothing, which means it makes changes to the object passed, i.e., the original sequence.
Syntax of sort() function in Python
Parameters of sort() function in Python
Two parameters are passed in the sort () built-in method, which is as follows:
- Key: It is an optional parameter. This works as a basis for comparison while sorting.
- Reverse: It is an optional parameter. It is a boolean variable, i.e., if set to True, it sorts the variable in descending order, else it sorts in ascending order. The default value of reverse is false.
Return Type of sort() function in Python
Sort() function makes changes to the original sequence. Therefore, its return type is None.
sorted() function in Python
- The sorted function in Python is one of the most versatile functions.
- It can be used to sort a list, set, and dictionary as well. It works on sequences, such as lists, tuples, or strings, as well as collections, such as a dictionary, set, or frozenset.
- It by default sorts in ascending order but can also sort in descending using the reverse parameter, i.e., if the reverse parameter is set to true, it sorts the dictionary in descending order.
- The specialty of the sorted function is that it does not affect the original sequence of the object, i.e., it creates a sorted copy of the object and returns it.
Syntax of sorted() function in Python
Parameters of sorted() function in Python
Three parameters are passed in the sorted() method in Python, which are as follows:
- Iterable: This is the Python object that needs to be sorted. It can either be a sequence, i.e. a list, tuple, or string, or a collection, i.e., a dictionary, set, or a frozenset
- Key: It is an optional parameter. This works as a basis for comparison while sorting.
- Reverse: It is an optional parameter. It is a boolean variable, i.e., if set to True, it sorts the variable in descending order, else it sorts in ascending order. The default value of reverse is false.
Return Type of sorted() function in Python
The sorted function returns a list of sorted items from whatever iterable you pass in.
Sort vs Sorted in Python
| Sort() method | Sorted() Method |
|---|---|
| The Sort() function only works on the list. | The Sorted()function can work both on Sequences and Collections. |
| It sorts the object in-place, so it returns None. | It returns a sorted list of the Iterable passed. |
| It sorts the original sequence, i.e., Inplace sorting. | It creates a sorted copy of the Python object. |
| It takes 2 parameters, i.e., key and reverse. | It takes 3 parameters, i.e., iterable, key, and reverse. |
| Syntax: list_name.sort(key, reverse=False) | Syntax: sorted(iterable, key, reverse = True) |
Examples of sort() function in Python
Example 1: Using sort() function with List in Python
Code:
Output:
Example 2: Using sort() function to sort in descending order
Code:
Output:
Explanation:
- In the above code, we can observe that first, we create a list that stores a sequence of unsorted sequence numbers.
- Then we apply the sort() method, which sorts the list in place.
- And lastly, we will get the sorted sequence of numbers.
Examples of sorted() function in Python
Example 1: Using sorted() function with List in Python
Code:
Output:
Example 2: Using sorted() function with Set in Python
Code:
Output:
Example 3: Using sorted() function with Dictionary in Python
Code:
Output:
Example 4: Using sorted() function with Tuple in Python
Code:
Output:
Example 5: Using sorted() function with String in Python
Code:
Output:
As you can see from the above examples, that the sorted() function returns a list of sorted items from whatever iterable you pass in.
Conclusion
Let’s summarise our topic difference between sort and sorted in Python by mentioning some of the important points.
- Python supports two different built-in methods (sort and sorted method) to perform the sorting operation on any sequence.
- The main difference between sort and sorted in Python is that sort function returns nothing and makes changes to the original sequence, while the sorted () function creates a new sequence type containing a sorted version of the given sequence.
- A sorted function takes 3 parameters, i.e., iterable, key, and reverse, whereas a sort function takes 2 parameters, i.e., key and reverse.
Learn more:
- Sort a String in Python
- selection sort in Python
- Sort Array in Python.
- Sort Dictionary by Key in Python.
- Sort Dictionary by Value in Python.
Сортировки и лямбда-функции
У стандартной сортировки (метода sort списка, функции sorted) есть более универсальный способ задания порядка сортировки при помощи параметра key. Значение этого параметра некоторая функция, которая вызывается для каждого элемента, перед сравнением этих элементов: элементы списка сортируются, но сравниваются не значения элементов, а результат вызова переданной функции от этого элемента.
Например, пусть дан список строк, содержащих цифры, нужно упорядочить элементы списка, сравнивая их, как числа, а не как строки. Это можно сделать так:
a = ["10", "20", "30", "1", "2", "3", "111", "112", "222"] a.sort(key=int)
В сложных случаях функцию нужно написать самостоятельно, например, пусть дан список чисел, который нужно упорядочить по последней цифре. Напишем функцию, которая возвращает последнюю цифру числа:
def last_digit(n): return n % 10 a.sort(key=last_digit)
Параметр key можно использовать вместе с параметром reverse .
Лямбда-функции
В предыдущем примере пришлось создавать отдельную функцию только для того, чтобы задать порядок сортировки, что захламляет программу ненужными функциями. В таких случаях нужно использовать лямбда-функции: “одноразовые фукцнии, которые можно объявлять без использовать слова def , прямо при вызове сортировки. Лямбда-функция — это функция, которая состоит только из одной строки с инструкцией return , то есть функция сразу возвращает значение по набору аргументов. Лямбда-функции объявляются таким образом:
lambda список переменных-аргументов: возвращаемое значение
Например, отсортировать список чисел по последней цифре можно при помощи следующей лямбда-функции:
a = [3, 15, 22, 13, 12, 32, 45, 43] a.sort(key=lambda n: n % 10)
Рассмотрим другой пример. Пусть дан список точек, каждая точка: кортеж из двух чисел. Например, [(3, -2), (7, 1), (0, 4)] . Этот список нужно отсортировать по возрастанию расстояния от начала координат до точки. Напишем лямбда-функцию:
a.sort(key=lamda point: point[0] ** 2 + point[1] ** 2)
Элементами списка являются кортежи из двух координат, можно обратиться к этим координатам по индексам [0] и [1].
Устойчивость сортировки
Вернёмся к примеру сортировки по последней цифре. В приведённом выше примере упорядоченный список будет таким:
[22, 12, 32, 3, 13, 43, 15, 45]
Этот пример иллюстрирует свойство устойчивости сортировки: функция сортировки не переставлят элементы, если они равны друг другу. В данном случае функция упорядочивает числа по последней цифре, а при равной последней цифре сохраняется порядок следования элементов в исходном списке: 22, 12, 32.
Что делать, если нужно сделать сложную сортировку, учитывающую несколько критериев? Например, при равной последней цифре нужно упорядочить элементы в порядке возрастания самих чисел.
Первый способ решения: напишем функцию, которая будет возвращать кортеж из двух чисел: последней цифры и самого числа. Кортежи сравниваются в лексикографическом порядке, поэтому при равенстве остатка от деления будут сравниваться сами числа.
a.sort(key=lambda n: (n % 10, n))
Второй способ: воспользуемся устойчивостью сортировки. Отстортируем список сначала по возрастанию чисел, а затем — по последней цифре. Тогда при равном значении последней цифры сохранится ранее полученный порядок.
a.sort() a.sort(key=lambda n: n % 10)
То есть сортировку по \(k\) параметрам (если по первому параметру элементы равны, то сравнить по второму, если равны два параметра, то сравнить по третьему и т.д.) можно заменить на \(k\) последовательных сортировок, выполняющихся в обратном порядке (от наименее значимого параметра к наиболее значимому).
Функция operator.itemgetter
При сортировке кортежей частой задачей является сортировка по какому-то одному элементу кортежа. Например, если нужно отсортировать кортежи по элементу с индексом 1, то можно написать такую лямбда-функцию:
a.sort(key=lambda elem: elem[1])
Для удобства в модуле operator есть функция itemgetter , которая позволяет создавать подобные функции, а именно, функция реализована примерно так:
def itemgetter(i): return lambda elem: elem[i]
То есть operator.itemgetter(i) — это функция, при вызове которой от числового параметра создаётся лямдба-функция, которую можно использовать в качестве параметра key . Если вызвать функцию itemgetter от нескольких параметров, то полученная функция будет возвращать кортеж из элементов с заданными индексами.