Explorons quelques applications plus avancées des fonctions lambda avec les dictionnaires, en nous concentrant sur le tri et la transformation des données des dictionnaires.
Tri des dictionnaires avec les fonctions Lambda
Les dictionnaires en Python ne sont pas ordonnés par défaut, mais nous avons parfois besoin de les traiter dans un ordre spécifique. Créons un nouveau fichier appelé advanced_dictionary_ops.py dans le répertoire /home/labex/project et ajoutons le code suivant :
## 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)
Exécutez le fichier :
python3 advanced_dictionary_ops.py
Vous devriez voir une sortie similaire à :
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}
Dans cet exemple, nous avons utilisé la fonction sorted() avec des fonctions lambda pour trier le dictionnaire de différentes manières :
- Par clé (nom de l'étudiant)
- Par valeur (score) par ordre croissant
- Par valeur (score) par ordre décroissant
Nous avons également utilisé le slicing [:3] pour obtenir uniquement les 3 meilleurs étudiants après le tri.
Voyons maintenant comment nous pouvons transformer les valeurs d'un dictionnaire. Ajoutez le code suivant à votre fichier 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)}")
Exécutez à nouveau le fichier :
python3 advanced_dictionary_ops.py
Vous devriez maintenant voir une sortie supplémentaire :
--- 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
Dans cet exemple :
- Nous avons converti les températures de Celsius en Fahrenheit à l'aide d'une compréhension de dictionnaire.
- Nous avons classé les températures comme "Cool", "Moderate" ou "Warm" à l'aide d'une fonction d'assistance.
- Nous avons utilisé la fonction
reduce() avec une lambda pour regrouper les villes par catégorie de température.
Ces techniques montrent comment les fonctions lambda peuvent rendre les opérations de dictionnaire complexes plus concises et lisibles. Comme vous pouvez le constater, la combinaison des fonctions lambda avec les fonctions intégrées de Python et les opérations de dictionnaire fournit des outils puissants pour la manipulation des données.