
Сортировка данных — одна из самых распространённых задач при работе с Python. Например, вам может понадобиться отсортировать список участников команды по именам или список проектов по приоритету.
В этой статье описывается, как сортировать списки в Python .
Python sort() и sorted()
В Python вы можете отсортировать список, используя встроенный метод list.sort() или встроенную функцию sorted() .
Функция sorted() создаёт новый отсортированный список, а метод list.sort() сортирует список на месте. Если вы хотите сохранить несортированный список, используйте функцию sorted() . Другое отличие заключается в том, что функция sorted() работает с любым итерируемым объектом.
Синтаксис sort() и sorted() следующий:
list . sort ( key = function , reverse = Boolean )
sorted ( iterable , key = function , reverse = Boolean )
Необязательные ключевые аргументы key и reverse имеют следующее значение:
-
key— функция, которая принимает один аргумент и преобразует его перед сравнением. Функция должна возвращать одно значение, используемое для сравнения сортировки. -
reverse— значение параметра «обратный» может бытьTrueилиFalse. Значение по умолчанию —True. Если этому аргументу присвоено значение false, список сортируется в обратном порядке.
Элементы списка сравниваются с помощью оператора «меньше» ( < ) и сортируются по возрастанию. Оператор < не поддерживает сравнение строки с целым числом, поэтому, если у вас есть список, содержащий строки и целые числа, сортировка завершится ошибкой.
В следующем примере показано, как отсортировать список строк в алфавитном порядке:
directions = [ "north" , "east" , "south" , "west" ] directions . sort () print ( 'Sorted list:' , directions )
Sorted list: ['east', 'north', 'south', 'west']
Если вы хотите сохранить исходный список без изменений, используйте функцию sorted() :
directions = [ "north" , "east" , "south" , "west" ] sorted_directions = sorted ( directions ) print ( 'Sorted list:' , sorted_directions )
Sorted list: ['east', 'north', 'south', 'west']
Чтобы отсортировать список в обратном (убывающем) порядке, установите аргумент reverse в True :
directions = [ "north" , "east" , "south" , "west" ] directions . sort ( reverse = True ) print ( 'Sorted list:' , directions )
Sorted list: ['west', 'south', 'north', 'east']
Сортировка с функцией
Аргумент key принимает функцию и позволяет выполнять более сложные операции сортировки.
Самый простой пример — сортировка элементов по их длине:
directions = [ "Arya" , "Daenerys" , "Jon" , "Brienne" ] directions . sort ( key = len ) print ( 'Sorted list:' , directions )
Мы используем функцию len() для возврата количества символов в строке, которая используется в качестве компаратора:
Sorted list: ['Jon', 'Arya', 'Brienne', 'Daenerys']
Вы также можете создать пользовательскую функцию и использовать её в качестве key аргумента для сравнения. Вот пример, показывающий, как отсортировать список целых чисел по сумме их цифр:
def sum_digits ( num ): digits = [ int ( x ) for x in str ( num )] return sum ( digits ) numbers = [ 23 , 77 , 19 , 310 , 219 ] numbers . sort ( reverse = True , key = sum_digits ) print ( 'Sorted list:' , numbers )
Sorted list: [77, 219, 19, 23, 310]
Другим примером может быть использование аргумента key для сортировки сложного списка, например списка кортежей:
numbers = [( 3 , 14 ), ( 1 , 61 ), ( 2 , 71 )] numbers . sort ( key = lambda k : k [ 0 ]) print ( 'Sorted list:' , numbers )
Мы используем анонимную (лямбда) функцию, которая возвращает первый элемент кортежа. Список сортируется по значению, возвращаемому функцией:
Sorted list: [(1, 61), (2, 71), (3, 14)]
Тот же подход можно использовать для сортировки списка словарей:
elements = [ { 'name' : 'Germanium' , 'number' : 25 , 'symbol' : 'ge' }, { 'name' : 'Silver' , 'number' : 47 , 'symbol' : 'ag' }, { 'name' : 'Iron' , 'number' : 26 , 'symbol' : 'fe' }, ] elements . sort ( key = lambda k : k [ 'name' ]) print ( 'Sorted list:' , elements )
Лямбда-функция возвращает значение ключа name , которое используется для сравнения:
Sorted list: [ {'name': 'Germanium', 'number': 25, 'symbol': 'ge'}, {'name': 'Iron', 'number': 26, 'symbol': 'fe'}, {'name': 'Silver', 'number': 47, 'symbol': 'ag'} ]
Лучший и быстрый способ сортировки сложной функции — использовать функции модуля Operator . Вот пример:
from operator import itemgetter elements = [ { 'name' : 'Germanium' , 'number' : 25 , 'symbol' : 'ge' }, { 'name' : 'Silver' , 'number' : 47 , 'symbol' : 'ag' }, { 'name' : 'Iron' , 'number' : 26 , 'symbol' : 'fe' }, ] elements . sort ( key = itemgetter ( 'symbol' )) print ( 'Sorted list:' , elements )
Функция itemgetter извлекает значение symbol ключа:
Sorted list: [ {'name': 'Silver', 'number': 47, 'symbol': 'ag'}, {'name': 'Iron', 'number': 26, 'symbol': 'fe'}, {'name': 'Germanium', 'number': 25, 'symbol': 'ge'} ]
Заключение
Мы показали вам, как сортировать списки в Python с помощью метода sort() и функции sorted() .
Если у вас есть вопросы или пожелания, не стесняйтесь оставлять комментарии.
Связанные руководства