Lassen Sie uns einige fortgeschrittenere Anwendungen von Lambda-Funktionen mit Dictionaries untersuchen, wobei wir uns auf das Sortieren und Transformieren von Dictionary-Daten konzentrieren.
Sortieren von Dictionaries mit Lambda-Funktionen
Dictionaries in Python sind standardmäßig nicht geordnet, aber manchmal müssen wir sie in einer bestimmten Reihenfolge verarbeiten. Lassen Sie uns eine neue Datei namens advanced_dictionary_ops.py
im Verzeichnis /home/labex/project
erstellen und den folgenden Code hinzufügen:
## 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)
Führen Sie die Datei aus:
python3 advanced_dictionary_ops.py
Sie sollten eine Ausgabe ähnlich der folgenden sehen:
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}
In diesem Beispiel haben wir die Funktion sorted()
mit Lambda-Funktionen verwendet, um das Dictionary auf verschiedene Arten zu sortieren:
- Nach Schlüssel (Schülername)
- Nach Wert (Punktzahl) in aufsteigender Reihenfolge
- Nach Wert (Punktzahl) in absteigender Reihenfolge
Wir haben auch Slicing [:3]
verwendet, um nur die obersten 3 Schüler nach dem Sortieren zu erhalten.
Schauen wir uns nun an, wie wir die Werte in einem Dictionary transformieren können. Fügen Sie Ihrer Datei advanced_dictionary_ops.py
den folgenden Code hinzu:
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)}")
Führen Sie die Datei erneut aus:
python3 advanced_dictionary_ops.py
Sie sollten nun eine zusätzliche Ausgabe sehen:
--- 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
In diesem Beispiel:
- Wir haben Temperaturen von Celsius in Fahrenheit umgerechnet, indem wir eine Dictionary-Comprehension verwendet haben.
- Wir haben Temperaturen als "Cool", "Moderate" oder "Warm" kategorisiert, indem wir eine Hilfsfunktion verwendet haben.
- Wir haben die Funktion
reduce()
mit einem Lambda verwendet, um Städte nach Temperaturkategorie zu gruppieren.
Diese Techniken zeigen, wie Lambda-Funktionen komplexe Dictionary-Operationen prägnanter und lesbarer machen können. Wie Sie sehen, bietet die Kombination von Lambda-Funktionen mit den integrierten Funktionen von Python und Dictionary-Operationen leistungsstarke Werkzeuge für die Datenmanipulation.