Vamos explorar algumas aplicações mais avançadas de funções lambda com dicionários, focando na ordenação e transformação de dados de dicionário.
Ordenando Dicionários com Funções Lambda
Dicionários em Python não são ordenados por padrão, mas às vezes precisamos processá-los em uma ordem específica. Vamos criar um novo arquivo chamado advanced_dictionary_ops.py no diretório /home/labex/project e adicionar o seguinte 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)
Execute o arquivo:
python3 advanced_dictionary_ops.py
Você deve ver uma saída semelhante 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}
Neste exemplo, usamos a função sorted() com funções lambda para ordenar o dicionário de diferentes maneiras:
- Por chave (nome do aluno)
- Por valor (pontuação) em ordem crescente
- Por valor (pontuação) em ordem decrescente
Também usamos o fatiamento [:3] para obter apenas os 3 melhores alunos após a ordenação.
Agora, vamos ver como podemos transformar os valores em um dicionário. Adicione o seguinte código ao seu arquivo 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)}")
Execute o arquivo novamente:
python3 advanced_dictionary_ops.py
Você deve agora ver uma saída 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
Neste exemplo:
- Convertemos temperaturas de Celsius para Fahrenheit usando uma compreensão de dicionário.
- Categorizamos as temperaturas como "Cool", "Moderate" ou "Warm" usando uma função auxiliar.
- Usamos a função
reduce() com uma lambda para agrupar cidades por categoria de temperatura.
Essas técnicas demonstram como as funções lambda podem tornar as operações de dicionário complexas mais concisas e legíveis. Como você pode ver, combinar funções lambda com as funções embutidas do Python e operações de dicionário fornece ferramentas poderosas para manipulação de dados.