Filter and Transform
În programele reale, avem nevoie constant să filtrăm datele (să păstrăm doar ce vrem) și să le transformăm (să modificăm fiecare element într-un fel). Acestea sunt două dintre cele mai des întâlnite operații din programare și le-am văzut deja, acum hai să le exersăm ca pe o abilitate
Filtrarea înseamnă: parcurge o listă și păstrează doar elementele care îndeplinesc o condiție
scoruri = [45, 82, 67, 91, 38, 74, 55, 96]
promovate = []
for s in scoruri:
if s >= 50:
promovate.append(s)
print(promovate)
Rezultat [82, 67, 91, 74, 55, 96]
Sau cu list comprehension
promovate = [s for s in scoruri if s >= 50]
Același rezultat, cod mai scurt
Transformarea înseamnă: aplică o operație fiecărui element
preturi = [10.0, 25.5, 8.0, 42.0]
cu_taxa = []
for pret in preturi:
cu_taxa.append(round(pret * 1.19, 2))
print(cu_taxa)
Rezultat [11.9, 30.35, 9.52, 49.98]
Sau cu list comprehension
cu_taxa = [round(pret * 1.19, 2) for pret in preturi]
Adevărata putere apare când le combinăm pe amândouă: filtrăm întâi, apoi transformăm (sau invers)
jucatori = [
{"nume": "Tommy", "scor": 95, "online": True},
{"nume": "Lance", "scor": 42, "online": False},
{"nume": "Cortez", "scor": 88, "online": True},
{"nume": "Phil", "scor": 71, "online": True},
{"nume": "Sonny", "scor": 33, "online": False}
]
nume_conectati = []
for jucator in jucatori:
if jucator["online"]:
nume_conectati.append(jucator["nume"])
print(nume_conectati)
Rezultat ['Tommy', 'Cortez', 'Phil']
Am filtrat (doar jucătorii online) și am transformat (am extras doar numele). Cu list comprehension
nume_conectati = [p["nume"] for p in jucatori if p["online"]]
Hai să facem un exemplu mai complex. Avem notele unor elevi și vrem să
- Filtrăm pe oricine a picat (sub 50)
- Transformăm notele rămase adăugând un bonus de 5 puncte
- Plafonăm la 100 (nimeni nu poate trece de 100)
note = [45, 82, 67, 91, 38, 74, 55, 96]
rezultat = []
for nota in note:
if nota >= 50:
amplificat = nota + 5
if amplificat > 100:
amplificat = 100
rezultat.append(amplificat)
print(rezultat)
Rezultat [87, 72, 96, 79, 60, 100]
Cu comprehension și min() pentru plafonare
rezultat = [min(g + 5, 100) for g in note if g >= 50]
Misiune: Filtru pentru Rețeaua de Energie
Reactoarele stației raportează citiri de putere într-o listă numită citiri. Inginerii vor să se concentreze pe reactoarele stabile și să le dea un mic impuls, dar niciun reactor nu poate depăși 100.
- Filtrează: păstrează doar citirile care sunt
>= 50(reactoarele stabile). - Transformă: adaugă un impuls de 5 puncte fiecărei citiri păstrate, plafonat la 100 (folosește
min(citire + 5, 100)ca să nu treacă nimic peste). - Afișează
Cu impuls:urmat de lista rezultată. - Afișează
Reactoare stabile:urmat de câte au trecut testul. - Afișează
Medie:urmat de media citirilor cu impuls, rotunjită la un număr întreg curound().
Ieșire
Cu impuls: [87, 72, 96, 79, 60, 100, 65]
Reactoare stabile: 7
Medie: 80