Расширенные приложения: сортировка и преобразование словарей
Давайте рассмотрим более продвинутые приложения лямбда-функций со словарями, сосредоточившись на сортировке и преобразовании данных словаря.
Сортировка словарей с помощью лямбда-функций
Словари в Python по умолчанию не упорядочены, но иногда нам нужно обрабатывать их в определенном порядке. Давайте создадим новый файл с именем advanced_dictionary_ops.py в каталоге /home/labex/project и добавим следующий код:
## Create a dictionary of student scores
student_scores = {
'Alice': 92,
'Bob': 85,
'Charlie': 78,
'David': 95,
'Eva': 88
}
print("Original student scores:", student_scores)
## Sort by student names (keys)
sorted_by_name = dict(sorted(student_scores.items()))
print("\nSorted by name:", sorted_by_name)
## Sort by scores (values) in ascending order
sorted_by_score_asc = dict(sorted(student_scores.items(), key=lambda item: item[1]))
print("\nSorted by score (ascending):", sorted_by_score_asc)
## Sort by scores (values) in descending order
sorted_by_score_desc = dict(sorted(student_scores.items(), key=lambda item: item[1], reverse=True))
print("\nSorted by score (descending):", sorted_by_score_desc)
## Get the top 3 students by score
top_3_students = dict(sorted(student_scores.items(), key=lambda item: item[1], reverse=True)[:3])
print("\nTop 3 students:", top_3_students)
Запустите файл:
python3 advanced_dictionary_ops.py
Вы должны увидеть вывод, похожий на:
Original student scores: {'Alice': 92, 'Bob': 85, 'Charlie': 78, 'David': 95, 'Eva': 88}
Sorted by name: {'Alice': 92, 'Bob': 85, 'Charlie': 78, 'David': 95, 'Eva': 88}
Sorted by score (ascending): {'Charlie': 78, 'Bob': 85, 'Eva': 88, 'Alice': 92, 'David': 95}
Sorted by score (descending): {'David': 95, 'Alice': 92, 'Eva': 88, 'Bob': 85, 'Charlie': 78}
Top 3 students: {'David': 95, 'Alice': 92, 'Eva': 88}
В этом примере мы использовали функцию sorted() с лямбда-функциями для сортировки словаря разными способами:
- По ключу (имя студента)
- По значению (оценка) в порядке возрастания
- По значению (оценка) в порядке убывания
Мы также использовали нарезку [:3], чтобы получить только 3 лучших студента после сортировки.
Преобразование значений словаря
Теперь давайте посмотрим, как мы можем преобразовать значения в словаре. Добавьте следующий код в файл advanced_dictionary_ops.py:
print("\n--- Transforming Dictionary Values ---")
## Create a dictionary of temperatures in Celsius
celsius_temps = {
'New York': 21,
'London': 18,
'Tokyo': 26,
'Sydney': 22,
'Moscow': 14
}
print("Temperatures in Celsius:", celsius_temps)
## Convert Celsius to Fahrenheit: F = C * 9/5 + 32
fahrenheit_temps = {city: round(temp * 9/5 + 32, 1) for city, temp in celsius_temps.items()}
print("Temperatures in Fahrenheit:", fahrenheit_temps)
## Categorize temperatures as cool, moderate, or warm
def categorize_temp(temp):
if temp < 18:
return "Cool"
elif temp < 25:
return "Moderate"
else:
return "Warm"
categorized_temps = {city: categorize_temp(temp) for city, temp in celsius_temps.items()}
print("Categorized temperatures:", categorized_temps)
## Group cities by temperature category using a lambda and reduce
from collections import defaultdict
from functools import reduce
grouped_cities = reduce(
lambda result, item: result[categorize_temp(item[1])].append(item[0]) or result,
celsius_temps.items(),
defaultdict(list)
)
print("\nCities grouped by temperature category:")
for category, cities in grouped_cities.items():
print(f"{category}: {', '.join(cities)}")
Запустите файл снова:
python3 advanced_dictionary_ops.py
Теперь вы должны увидеть дополнительный вывод:
--- Transforming Dictionary Values ---
Temperatures in Celsius: {'New York': 21, 'London': 18, 'Tokyo': 26, 'Sydney': 22, 'Moscow': 14}
Temperatures in Fahrenheit: {'New York': 69.8, 'London': 64.4, 'Tokyo': 78.8, 'Sydney': 71.6, 'Moscow': 57.2}
Categorized temperatures: {'New York': 'Moderate', 'London': 'Moderate', 'Tokyo': 'Warm', 'Sydney': 'Moderate', 'Moscow': 'Cool'}
Cities grouped by temperature category:
Cool: Moscow
Moderate: New York, London, Sydney
Warm: Tokyo
В этом примере:
- Мы преобразовали температуру из Цельсия в Фаренгейт, используя генератор словаря.
- Мы категоризировали температуры как «Прохладно», «Умеренно» или «Тепло», используя вспомогательную функцию.
- Мы использовали функцию
reduce() с лямбда-выражением для группировки городов по категории температуры.
Эти методы демонстрируют, как лямбда-функции могут сделать сложные операции со словарями более лаконичными и читаемыми. Как вы видите, сочетание лямбда-функций со встроенными функциями Python и операциями со словарями предоставляет мощные инструменты для обработки данных.