Перевод статьи «How to sort with lambda in Python».
Операции сортировки применяются к спискам данных на любом языке программирования. В Python для хранения наборов данных используются кортеж, список и словарь. Доступ к значениям кортежа и списка осуществляется по индексу, а к значениям словаря — по ключам.
В Python есть множество встроенных функций для сортировки списка данных в порядке возрастания или убывания. Лямбда-функция – одна из них. С ее помощью мы можем определить порядок сортировки в зависимости от требований.
Давайте рассмотрим на простых примерах использование лямбда-функции для сортировки списка чисел, кортежей, словарей и вложенного списка.
Пример 1. Сортировка списка чисел в формате строковых данных
Напишем код для сортировки списка строковых данных, которые являются числами, с применением лямбда-функции.
Зададим список из 6 элементов. Лямбду будем использовать внутри функции sorted()
для сортировки списка.
В качестве первого аргумента функции указывается переменная списка, лямбда устанавливается в качестве значения ключа, а третьим аргументом передается начальная позиция сортировки. При помощи print()
выводим в консоль отсортированный список через пробел.
n_list = ['11', '50', '5', '1', '37', '19'] # Sort the list using lambda and sorted function sorted_list = sorted(n_list, key=lambda x: int(x[0:])) # Print the sorted list print("The list of the sorted values are:") for value in sorted_list: print(value, end=' ')
Запустив наш код, получим следующий результат.
The list of the sorted values are: 1 5 11 19 37 50
Пример 2. Сортировка списка кортежей
Теперь давайте напишем программу для сортировки списка из трех кортежей, каждый из которых состоит из трех элементов.
Здесь мы используем три типа сортировки.
В первой сортирующей функции позиция сортировки устанавливается в 0. Таким образом мы отсортируем список по первым элементам кортежей.
Во второй сортирующей функции позиция сортировки – 1. Так мы отсортируем список по вторым элементам кортежей.
Чтобы отсортировать список по третьим элементам кортежей, установим позицию сортировки 2.
tuple_list = [("HTML", 15, 'M01'), ("JavaScript", 10, 'M03'), ("Bootstrap", 5, 'M02')] # Sort the list based on the first item of the tuple sorted_list1 = sorted(tuple_list, key=lambda x: x[0]) # Print the first sorted list print("The sorted list based on the first item:\n", sorted_list1) # Sort the list based on the second item of the tuple sorted_list2 = sorted(tuple_list, key=lambda x: x[1]) # Print the second sorted list print("The sorted list based on the second item:\n", sorted_list2) # Sort the list based on the third item of the tuple sorted_list3 = sorted(tuple_list, key=lambda x: x[2]) # Print the third sorted list print("The sorted list based on the third item:\n", sorted_list3)
Запустим наш код и получим три списка кортежей, отсортированных по указанным позициям.
The sorted list based on the first item: [('Bootstrap', 5, 'M02'), ('HTML', 15, 'M01'), ('JavaScript', 10, 'M03')] The sorted list based on the second item: [('Bootstrap', 5, 'M02'), ('JavaScript', 10, 'M03'), ('HTML', 15, 'M01')] The sorted list based on the third item: [('HTML', 15, 'M01'), ('Bootstrap', 5, 'M02'), ('JavaScript', 10, 'M03')]
Пример 3. Сортировка списка, состоящего из других списков
Теперь давайте напишем код для сортировки вложенного списка с использованием нашей лямбда-функции.
Объявим пустой список для хранения значений отсортированного списка. Для сортировки элементов вложенного списка воспользуемся вложенными циклами for
. Внешний цикл for
будет повторяться в зависимости от количества внутренних списков, определенных в основном списке.
В нашем случае у нас есть три внутренних списка. Первый из них имеет три элемента, второй – два, а третий состоит из четырех элементов. Количество итераций внутреннего цикла for
будет зависеть от количества элементов в каждом внутреннем списке.
Функция sorted()
вызывает лямбда-выражение внутри внутреннего цикла для сортировки вложенного списка.
nested_list = [['Mango', 'Banana', 'Orange'], ['Rose', 'Lily'], ['Lion', 'Monkey', 'Tiger', 'Deer']] # Declare an empty list sorted_data = [] # Loop to iterate the outer list for i in range(len(nested_list)): # Loop to iterate the inner list for j in range(len(nested_list[i])): # Sort the inner list sorted_list = sorted(nested_list[i], key=lambda x: x[0]) # Append the sorted list sorted_data.append(sorted_list) # Print the sorted nested list print("The list after sorting:\n {}".format(sorted_data))
В выводе мы получим список из трех отсортированных списков.
The list after sorting: [['Banana', 'Mango', 'Orange'], ['Lily', 'Rose'], ['Deer', 'Lion', 'Monkey', 'Tiger']]
Пример 4. Сортировка списка словарей
Напишем код для сортировки списка, состоящего из словарей, с использованием лямбда-функции.
Каждый словарь внутри списка содержит три пары ключ-значение.
Рассмотрим четыре типа сортировки. Первый использует сортировку на основе ключа code
. Второй – на основе ключа name
. Третий способ демонстрирует сортировку на основе обоих этих ключей. В четвертом случае мы видим сортировку в порядке убывания на основе ключа name
.
dic_list = [{"code": "CSE-401", "name": "Multimedia", "Credit": 2.0}, {"code": "CSE-101", "name": "Computer Fundamental", "Credit": 1.5}, {"code": "CSE-305", "name": "Unix Programming", "Credit": 3.0}] # Print the sorted dictionary based on code print("Sorting based on the code:\n", sorted(dic_list, key=lambda i: i['code'])) # Print the sorted dictionary based on name print("Sorting based on the name:\n", sorted(dic_list, key=lambda i: (i['name']))) # Print the sorted dictionary based on code and name print("Sorting based on the code and name:\n", sorted(dic_list, key=lambda i: (i['code'], i['name']))) # Print the sorted dictionary in descending based on name print("Sorting in descending order based on the name:\n", sorted(dic_list, key=lambda i: i['name'], reverse=True))
Запустим нашу программу и получим следующий результат.
Sorting based on the code: [{'code': 'CSE-101', 'name': 'Computer Fundamental', 'Credit': 1.5}, {'code': 'CSE-305', 'name': 'Unix Programming', 'Credit': 3.0}, {'code': 'CSE-401', 'name': 'Multimedia', 'Credit': 2.0}] Sorting based on the name: [{'code': 'CSE-101', 'name': 'Computer Fundamental', 'Credit': 1.5}, {'code': 'CSE-401', 'name': 'Multimedia', 'Credit': 2.0}, {'code': 'CSE-305', 'name': 'Unix Programming', 'Credit': 3.0}] Sorting based on the code and name: [{'code': 'CSE-101', 'name': 'Computer Fundamental', 'Credit': 1.5}, {'code': 'CSE-305', 'name': 'Unix Programming', 'Credit': 3.0}, {'code': 'CSE-401', 'name': 'Multimedia', 'Credit': 2.0}] Sorting in descending order based on the name: [{'code': 'CSE-305', 'name': 'Unix Programming', 'Credit': 3.0}, {'code': 'CSE-401', 'name': 'Multimedia', 'Credit': 2.0}, {'code': 'CSE-101', 'name': 'Computer Fundamental', 'Credit': 1.5}]
Заключение
Мы рассмотрели использование лямбда-функции для сортировки различных списков в Python. Разобрали на простых примерах, как можно отсортировать четыре разных списка. Надеемся, это поможет вам понять цель использования лямбда-функции при сортировке.