Exploremos algunas aplicaciones más avanzadas de las funciones lambda con diccionarios, centrándonos en la clasificación y transformación de datos de diccionarios.
Ordenar diccionarios con funciones Lambda
Los diccionarios en Python no están ordenados por defecto, pero a veces necesitamos procesarlos en un orden específico. Creemos un nuevo archivo llamado advanced_dictionary_ops.py en el directorio /home/labex/project y agreguemos el siguiente código:
## 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)
Ejecute el archivo:
python3 advanced_dictionary_ops.py
Debería ver una salida similar a:
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}
En este ejemplo, usamos la función sorted() con funciones lambda para ordenar el diccionario de diferentes maneras:
- Por clave (nombre del estudiante)
- Por valor (puntuación) en orden ascendente
- Por valor (puntuación) en orden descendente
También usamos el slicing [:3] para obtener solo los 3 mejores estudiantes después de ordenar.
Ahora, veamos cómo podemos transformar los valores en un diccionario. Agregue el siguiente código a su archivo 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)}")
Ejecute el archivo de nuevo:
python3 advanced_dictionary_ops.py
Ahora debería ver una salida adicional:
--- 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
En este ejemplo:
- Convertimos las temperaturas de Celsius a Fahrenheit usando una comprensión de diccionario.
- Categorizamos las temperaturas como "Cool", "Moderate" o "Warm" usando una función auxiliar.
- Usamos la función
reduce() con una lambda para agrupar las ciudades por categoría de temperatura.
Estas técnicas demuestran cómo las funciones lambda pueden hacer que las operaciones complejas de diccionarios sean más concisas y legibles. Como puede ver, la combinación de funciones lambda con las funciones integradas de Python y las operaciones de diccionario proporciona herramientas poderosas para la manipulación de datos.