Использование лямбда-функции для сортировки списков в Python

Перевод статьи «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. Разобрали на простых примерах, как можно отсортировать четыре разных списка. Надеемся, это поможет вам понять цель использования лямбда-функции при сортировке.