List comprehension în Python: filtrare și transformare
List comprehension în Python: filtrare și transformare. Exemple explicate, cazuri-limită și întrebări frecvente pentru a înțelege și verifica rezultatul.
În acest material
O list comprehension construiește o listă nouă pornind de la o parcurgere, o expresie și, opțional, o condiție de filtrare. Numele poate părea complicat, dar ideea este simplă: alegem anumite elemente și calculăm pentru fiecare valoarea care intră în rezultat. Ordinea de parcurgere se păstrează, iar lista inițială nu este modificată.
Cerință și limite
Citim n, între 0 și 1000, apoi n întregi, câte unul pe linie, din [-10000,10000]. Selectăm numerele pare și afișăm pătratele lor în ordinea inițială, separate prin spații. Dacă nu există numere pare, afișăm o linie goală. Un număr este par dacă restul împărțirii sale la doi este zero, inclusiv pentru valori negative.
Exemplu urmărit
Pentru lista [3,-2,0,5,4], elementele selectate sunt -2, 0 și 4. Pătratele lor sunt 4, 0 și 16. Valoarea 3 nu este transformată și apoi verificată: condiția se aplică elementului original. Rezultatul conține trei elemente, deși lista inițială conține cinci.
Din 3, -2, 0, 5, 4 păstrăm numerele pare și obținem pătratele 4, 0, 16.Mărește schema ↗
Pașii soluției
Citim valorile într-o listă. Expresia [x * x for x in valori if x % 2 == 0] se citește astfel: pentru fiecare x din valori, dacă x este par, adaugă x*x în noua listă. Deși expresia de transformare este scrisă prima, filtrul decide dacă acel element produce un rezultat. Afișăm elementele listei noi prin print cu despachetare.
De ce funcționează
Fiecare element inițial este vizitat exact o dată. Condiția acceptă exact numerele pare, iar expresia produce exact pătratul fiecăruia. Cum parcurgerea merge în ordinea listei, și rezultatele au aceeași ordine relativă. Niciun element impar nu generează o poziție goală sau un zero artificial: este pur și simplu omis.
Cost și capcane
Timpul este O(n), iar memoria rezultatului este O(k), unde k este numărul valorilor pare. Păstrăm și lista inițială, deci memoria totală este O(n). Nu confunda filtrarea cu o expresie condițională care produce o valoare pentru fiecare element. Nu folosi o comprehension doar pentru efecte secundare, cum ar fi afișarea repetată: o buclă obișnuită explică mai bine o asemenea intenție. Pentru mai multe condiții sau ramuri complicate, lizibilitatea poate fi mai bună cu for.
Program complet Python 3
n = int(input())
valori = [int(input()) for _ in range(n)]
rezultat = [x * x for x in valori if x % 2 == 0]
print(*rezultat)
Exersează
Pentru [1,3,5], rezultatul este gol. Pentru [-4,-2], rezultatul este [16,4], nu o listă sortată. Pentru [0], rezultatul conține un zero. Verifică separat faptul că lista inițială rămâne [3,-2,0,5,4] după construirea rezultatului. Ca extensie, schimbă filtrul pentru a păstra numai numerele strict pozitive și prezice ieșirea înainte de rulare.
Continuă studiul
Pentru a urmări codul fără pași neexplicați, revino la citirea și validarea intrării, listele, indicii și modificarea elementelor, funcțiile, parametrii și return. Aceste lecții separă citirea, prelucrarea și afișarea, aceeași împărțire folosită în exemplul de aici.
Semantica operațiilor este documentată în referința oficială Python. Programul folosește numai biblioteca standard și poate fi rulat cu Python 3.9 sau mai nou.
Întrebări frecvente
List comprehension modifică lista sursă?
Nu în acest exemplu. Ea construiește o listă nouă cu rezultatele expresiei, iar valorile întregi din sursă rămân identice.
Se păstrează duplicatele?
Da. Fiecare apariție acceptată produce un element; două valori pare egale dau două pătrate egale.
Ce se întâmplă când niciun element trece filtrul?
Rezultatul este lista goală. Print cu despachetarea ei afișează doar trecerea la linia următoare.
Un pas mai departe
Autentifică-te pentru a păstra progresul în cont.