- Использование лямбда-функции для сортировки списков в Python
- Пример 1. Сортировка списка чисел в формате строковых данных
- Пример 2. Сортировка списка кортежей
- Пример 3. Сортировка списка, состоящего из других списков
- Пример 4. Сортировка списка словарей
- Заключение
- Возможности и примеры функции sorted в Python
- Параметр key
- 1. Встроенная функция
- 2. Пользовательские функции
- 3. Лямбда-функция
Использование лямбда-функции для сортировки списков в 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 = [, , ] # 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: [, , ] Sorting based on the name: [, , ] Sorting based on the code and name: [, , ] Sorting in descending order based on the name: [, , ]
Заключение
Мы рассмотрели использование лямбда-функции для сортировки различных списков в Python. Разобрали на простых примерах, как можно отсортировать четыре разных списка. Надеемся, это поможет вам понять цель использования лямбда-функции при сортировке.
Возможности и примеры функции sorted в Python
Функция sorted() возвращает новый отсортированный список итерируемого объекта (списка, словаря, кортежа). По умолчанию она сортирует его по возрастанию.
Сортировка строк осуществляется по ASCII-значениям.
- Возвращаемое значение — List (список).
- Синтаксис: sorted(iterable,key=None,reverse=False) .
- iterable : строка, список, кортеж, множество, словарь
- key (необязательный параметр): если указать ключ, то сортировка будет выполнена по функции этого ключа.
- reverse (необязательный параметр): по умолчанию сортировка выполняется по возрастанию. Если указать reverse=True , то можно отсортировать по убыванию.
# Сортировка строки
s2="hello"
print(sorted(s2)) # Вывод:['e', 'h', 'l', 'l', 'o']
print(sorted(s2, reverse=True)) # Вывод:['o', 'l', 'l', 'h', 'e']
# Сортировка списка
l1=[1, 4, 5, 2, 456, 12]
print(sorted(l1)) # Вывод:[1, 2, 4, 5, 12, 456]
print(sorted(l1, reverse=True)) # Вывод:[456, 12, 5, 4, 2, 1]
# Сортировка кортежа
t1=(15, 3, 5, 7, 9, 11, 42)
print(sorted(t1)) # Вывод:[3, 5, 7, 9, 11, 15, 42]
print(sorted(t1, reverse=True)) # Вывод:[42, 15, 11, 9, 7, 5, 3]
# Сортировка списка кортежей
t2=[(1, 2), (11, 12), (0, 2), (3, 2)]
print(sorted(t2)) # Вывод:[(0, 2), (1, 2), (3, 2), (11, 12)]
print(sorted(t2, reverse=True)) # Вывод:[(11, 12), (3, 2), (1, 2), (0, 2)]
# Сортировка множества
s1=
print(sorted(s1)) # Вывод:[1, 2, 3, 4, 6, 8, 11, 32]
print(sorted(s1, reverse=True)) # Вывод:[32, 11, 8, 6, 4, 3, 2, 1]
# Сортировка словаря
d1=
# Вернется список отсортированных ключей
print(sorted(d1)) # Вывод:[1, 2, 3]
# Вернется список отсортированных значений
print(sorted(d1.values())) # Вывод:['blue', 'green', 'red']
# Вернется список кортежей (ключ, значение), отсортированный по ключам.
print(sorted(d1.items())) # Вывод:[(1, 'green'), (2, 'red'), (3, 'blue')]
# Сортировка словаря в обратном порядке
print(sorted(d1, reverse=True)) # Вывод:[3, 2, 1]
print(sorted(d1.values(), reverse=True)) # Вывод:['red', 'green', 'blue']
print(sorted(d1.items(), reverse=True)) # Вывод:[(3, 'blue'), (2, 'red'), (1, 'green')]Параметр key
Итерируемый объект можно также отсортировать по функции, указанной в параметре key . Это может быть:
- Встроенная функция,
- Определенная пользователем функция,
- Лямбда-функция,
- itemgetter,
- attrgetter.
1. Встроенная функция
len() — посчитает длину объекта. Если указать len в виде параметра key, то сортировка будет выполнена по длине.
# Сортировка словаря на основе функции len
l1 =
# Возвращает список ключей, отсортированных по функции len
print(sorted(l1, key=len))
# Вывод: ['red', 'apple', 'carrot']
# Возвращает список значений, отсортированных на основе функции len
print(sorted(l1.values(), key=len))
# Вывод: ['fruit', 'color', 'vegetable']
# Сортировка списка на основе функции len
l1 = ['blue', 'green', 'red', 'orange']
print(sorted(l1, key=len))
# Вывод: ['red', 'blue', 'green', 'orange']abs() вернет абсолютно значение числа. Если задать abs для key , то сортировка будет основана на абсолютном значении.
# Сортировка списка по абсолютному значению
l1 = [1, -4, 5, -7, 9, 2]
print(sorted(l1, key=abs))
# Вывод: [1, 2, -4, 5, -7, 9]str.lower() — конвертирует все символы в верхнем регистре в нижний регистр. В таком случае список будет отсортирован так, будто бы все символы в нижнем регистре.
s1 = "Hello How are you"
# Разбивает строку и сортирует по словам
print(sorted(s1.split()))
# Вывод: ['Hello', 'How', 'are', 'you']
# Разбивает строку и сортирует после применения str.lower ко всем элементам
print(sorted(s1.split(), key=str.lower))
# Вывод: ['are', 'Hello', 'How', 'you']
d1 =
# Возвращает список ключей, отсортированный по значениям
print(sorted(d1))
# Вывод: ['Banana', 'Pears', 'apple']
# Возвращает список ключей, отсортированный после применения str.lower ко всем элементам
print(sorted(d1, key=str.lower))
# Вывод: ['apple', 'Banana', 'Pears']2. Пользовательские функции
Также можно указывать свои функции.
Пример №1: по умолчанию сортировка кортежа происходит по первому элементу в нем. Добавим функцию, которая будет возвращать второй элемент кортежа. Теперь и сортировка будет опираться на соответствующий элемент.
# напишем функцию для получения второго элемента
def sort_key(e):
return e[1]
l1 = [(1, 2, 3), (2, 1, 3), (11, 4, 2), (9, 1, 3)]
# По умолчанию сортировка выполняется по первому элементу
print(sorted(l1))
# Вывод: [(1, 2, 3), (2, 1, 3), (9, 1, 3), (11, 4, 2)]
# Сортировка по второму элементу с помощью функции sort_key
print(sorted(l1, key=sort_key))
# Вывод: [(2, 1, 3), (9, 1, 3), (1, 2, 3), (11, 4, 2)]Пример №2: можно сортировать объекты класса с помощью функций. Вот как это происходит:
- У класса Studen есть три атрибута: name , rollno , grade .
- Создаются три объекта этого класса: s1 , s2 , s3 .
- Создается список s4 , который содержит все три объекта.
- Дальше происходит сортировка по этому списку.
- Определенная функция ( sort_key ) возвращает атрибут rollno .
- В функции sorted эта функция задана для параметра key .
- Теперь sorted() возвращает список объектов Student , которые отсортированы по значению rollno .
class Student:
def __init__(self, name, rollno, grade):
self.name = name
self.rollno = rollno
self.grade = grade
def __repr__(self):
return f"--"
# Создание объектов
s1 = Student("Paul", 15, "second")
s2 = Student("Alex", 12, "fifth")
s3 = Student("Eva", 21, "first")
s4 = [s1, s2, s3]
# Сортировка списка объектов
# Создание функции, которая вернет rollno объекта
def sort_key(s):
return s.rollno
# сортировка списка объектов без ключевого параметра, вызывает TypeError
print(sorted(s4))
# Вывод: TypeError: '>' not supported between instances of 'Student' and 'Student'
# Сортировка списка объектов по атрибуту: rollno
s5 = sorted(s4, key=sort_key)
print(s5)
# Вывод: [Alex-12-fifth, Paul-15-second, Eva-21-first]3. Лямбда-функция
Также в качестве ключа можно задать лямбда-функцию. Сортировка будет выполняться по ней.
Пример №1: сортировка списка объектов класса на основе лямбда-функции, переданной для параметра key .