Я хочу отсортировать список словарей в своей программе Python и мне интересно, можно ли использовать для этого лямбда-функцию. Это возможно?
Да, лямбда-функции позволяют сортировать списки словарей на основе определенных ключей словаря.
Предположим, у вас есть список словарей, где каждый словарь представляет человека со следующими атрибутами:
Допустим, вы хотите отсортировать этот список словарей по возрасту каждого человека.
Вот как это можно сделать с помощью лямбда-функции в Python:
# Define a list of dictionaries, each representing a person with a firstname, lastname, and age
people = [
{'firstname':'John', 'lastname':'Ross', 'age': 30},
{'firstname':'Mark', 'lastname':'Green', 'age': 25},
{'firstname':'Jane', 'lastname':'Black', 'age': 43}
]
# Sort the list by the 'age' of each person using a lambda function
sorted_people = sorted(people, key=lambda person: person['age'])
# Print the original list
print("Original list:", people)
# Print the sorted list
print("Sorted by age:", sorted_people)
Это вывод фрагмента кода выше:
Original list: [{'firstname': 'John', 'lastname': 'Ross', 'age': 30}, {'firstname': 'Mark', 'lastname': 'Green', 'age': 25}, {'firstname': 'Jane', 'lastname': 'Black', 'age': 43}]
Sorted by age: [{'firstname': 'Mark', 'lastname': 'Green', 'age': 25}, {'firstname': 'John', 'lastname': 'Ross', 'age': 30}, {'firstname': 'Jane', 'lastname': 'Black', 'age': 43}]
Вы видите, что словари в списке правильно отсортированы по признаку возраста.
Давайте рассмотрим самые важные строки этого кода Python:
sorted(people, key=lambda person: person['age'])
: Эта строка сортирует список people
. Функция sorted()
возвращает новый отсортированный список. Аргумент key
— лямбда-функция lambda person: person['age']
, которая указывает, что сортировка должна быть основана на атрибуте age в каждом словаре.- Исходный список
people
остается неизменным после операции сортировки, поскольку встроенная функция sorted()
не изменяет список на месте, а вместо этого возвращает новый отсортированный список. - Операторы печати используются для отображения исходного списка и отсортированного списка. Это позволяет увидеть разницу и подтвердить правильность логики сортировки.
Используя лямбда-функцию в функции sorted()
, вы можете сортировать сложные структуры данных, такие как список словарей, и сделать свой код удобным для чтения.
Сортировка списка в обратном порядке с использованием лямбда-функции
Сортировка списка словарей в обратном порядке с использованием лямбды проста. Это расширение метода сортировки, который вы видели в предыдущем абзаце.
Передавая аргумент reverse=True
в функцию sorted()
, вы можете инвертировать порядок сортировки по умолчанию. Это полезно, когда вы хотите отсортировать данные в порядке убывания. Например, чтобы расположить элементы от самого высокого значения к самому низкому (представьте, что вы пишете код для интернет-магазина и хотите, чтобы пользователи могли сортировать элементы по цене).
Функция лямбда останется прежней, но вы добавите аргумент reverse=True
к функции sorted()
для достижения обратной сортировки. Вот обновленный код:
people = [
{'firstname':'John', 'lastname':'Ross', 'age': 30},
{'firstname':'Mark', 'lastname':'Green', 'age': 25},
{'firstname':'Jane', 'lastname':'Black', 'age': 43}
]
# Sort the list by the 'age' of each person in reverse order using a lambda function
sorted_people_descending = sorted(people, key=lambda person: person['age'], reverse=True)
# Print the original list
print("Original list:", people)
# Print the list sorted in reverse order
print("Sorted by age in reverse order:", sorted_people_descending)
Вывод подтверждает, что список был отсортирован в обратном порядке по возрасту:
Original list: [{'firstname': 'John', 'lastname': 'Ross', 'age': 30}, {'firstname': 'Mark', 'lastname': 'Green', 'age': 25}, {'firstname': 'Jane', 'lastname': 'Black', 'age': 43}]
Sorted by age in reverse order: [{'firstname': 'Jane', 'lastname': 'Black', 'age': 43}, {'firstname': 'John', 'lastname': 'Ross', 'age': 30}, {'firstname': 'Mark', 'lastname': 'Green', 'age': 25}]
Вот основное отличие от кода в предыдущем абзаце:
sorted(people, key=lambda person: person['age'], reverse=True)
: Эта строка сортирует список people
по возрасту в обратном порядке. Лямбда-функция lambda person: person['age']
указывает ключ для сортировки и reverse=True
инвертирует порядок сортировки.
Этот пример демонстрирует гибкость лямбда-функций в операциях сортировки. Лямбда-функции позволяют выполнять сортировку как по возрастанию, так и по убыванию с минимальными изменениями в коде.
Сортировка списков словарей по нескольким атрибутам с использованием лямбда-выражений
Сортировка списка словарей в Python на основе нескольких атрибутов также возможна. Используя лямбда-функцию внутри функции sorted()
, вы можете предоставить несколько критериев сортировки и упорядочить данные на основе первичного атрибута, а затем вторичного атрибута в случае связей.
Это может быть полезно, когда сортировки по одному атрибуту недостаточно для достижения желаемого порядка.
В примере кода вы будете использовать ту же структуру словаря для людей, которая использовалась ранее. Если у вас есть несколько людей одного возраста, вы можете отсортировать список сначала по возрасту, а затем по имени.
Давайте посмотрим на практике. Добавьте в список еще несколько словарей, чтобы в нем были люди с одинаковым значением возраста.
# List of dictionaries with some people having the same age
people = [
{'firstname':'John', 'lastname':'Ross', 'age': 30},
{'firstname':'Mark', 'lastname':'Green', 'age': 25},
{'firstname':'Jane', 'lastname':'Black', 'age': 43},
{'firstname': 'David', 'lastname':'White', 'age': 30}, # Same age as John
{'firstname': 'Eve', 'lastname':'Red', 'age': 25} # Same age as Mark
]
# Sorting the list first by age, then by firstname
sorted_people = sorted(people, key=lambda person: (person['age'], person['firstname']))
# Displaying the sorted list
print("Sorted by age and then firstname:", sorted_people)
Посмотрите на отсортированный список. Сортировка по двум атрибутам работает отлично:
Sorted by age and then firstname: [{'firstname': 'Eve', 'lastname': 'Red', 'age': 25}, {'firstname': 'Mark', 'lastname': 'Green', 'age': 25}, {'firstname': 'David', 'lastname': 'White', 'age': 30}, {'firstname': 'John', 'lastname': 'Ross', 'age': 30}, {'firstname': 'Jane', 'lastname': 'Black', 'age': 43}]
В этом коде lambda person: (person['age'], person['firstname'])
в качестве ключа сортировки используется лямбда-функция.
Кортеж указывает , (person['age'], person['firstname'])
что список должен быть отсортирован в первую очередь по возрасту, а затем по имени в случае возрастных связей.
В заключение, способность Python сортировать списки словарей с помощью лямбда-функций делает манипуляцию данными очень простой и понятной для чтения. Будь то сортировка на основе одного атрибута, в обратном порядке или по нескольким атрибутам.
Освоив эти методы сортировки, вы сможете работать с любой структурой данных. Это делает Python бесценным инструментом для вас как разработчика программного обеспечения.