MySQL Java JavaScript PHP Python HTML-CSS C-sharp

List comprehension

Funcționalitatea list comprehension oferă o sintaxă mai scurtă și concisă pentru a crea liste pe baza altor seturi de date. Aceasta are următoarea sintaxă:

newlist = [expression for item in iterable (if condition)]

Sintaxa list comprehension constă din următoarele componente:

  • iterable: sursa de date iterabilă, care poate fi o listă, o mulțime, o secvență sau chiar o funcție care returnează un set de date, de exemplu, range()
  • item: elementul extras din sursa de date
  • expression: expresia care returnează o valoare. Această valoare este apoi inclusă în lista generată
  • condition: condiția pe care trebuie să o îndeplinească elementele extrase din sursa de date. Dacă un element NU îndeplinește condiția, acesta NU este selectat. (Parametru opțional)

Să luăm un exemplu simplu. Să presupunem că trebuie să selectăm dintr-o listă toate numerele care sunt mai mari de 0. În mod normal, am putea scrie astfel:

numbers = [-3, -2, -1, 0, 1, 2, 3]
positive_numbers = []
for n in numbers:
   if n > 0:
       positive_numbers.append(n)

print(positive_numbers)     # [1, 2, 3]

Acum, vom modifica acest cod folosind list comprehension:

numbers = [-3, -2, -1, 0, 1, 2, 3]
positive_numbers = [n for n in numbers if n > 0]

print(positive_numbers)     # [1, 2, 3]

Expresia [n for n in numbers if n > 0] indică să selectăm din lista numbers fiecare element în variabila n, dacă n este mai mare de 0 și să returnăm n în lista rezultată.

Sursa de date iterable

Ca sursă de date iterable poate fi utilizat orice obiect iterabil, de exemplu, o altă listă, un dicționar etc. De exemplu, funcția range() returnează toate numerele de la zero până la pragul specificat, fără a-l include:

numbers = [n for n in range(10)]
print(numbers)      # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

Deseori, această construcție este utilizată pentru a crea o listă dintr-un dicționar. De exemplu, să selectăm toate cheile dintr-un dicționar:

dictionary = {"red": "roșu", "blue": "albastru", "green": "verde"}
words = [word for word in dictionary]
print(words)    # ['red', 'blue', 'green']

Returnarea rezultatului

Parametrul expression reprezintă expresia care returnează o valoare. Această valoare este apoi plasată în lista generată. În exemplele de mai sus, aceasta era elementul curent extras din sursa de date:

numbers = [-3, -2, -1, 0, 1, 2, 3]
new_numbers = [n for n in numbers]
print(new_numbers)      # [-3, -2, -1, 0, 1, 2, 3]

În acest caz, parametrul expression reprezintă direct elementul n extras din lista numbers. Dar pot fi și valori mai complexe. De exemplu, să returnăm valoarea dublată a unui număr:

numbers = [-3, -2, -1, 0, 1, 2, 3]
new_numbers = [n * 2 for n in numbers]
print(new_numbers)      # [-6, -4, -2, 0, 2, 4, 6]

Aici, expression reprezintă expresia n * 2

Pot fi și expresii mai complexe:

numbers = [-3, -2, -1, 0, 1, 2, 3]
new_numbers = [n * 2 if n > 0 else n for n in numbers]
print(new_numbers)      # [-3, -2, -1, 0, 2, 4, 6]

Aici, parametrul expression reprezintă expresia n * 2 if n > 0 else n. În acest caz, indicăm să returneze valoarea n * 2, dacă n > 0, altfel returnează n.

În expression se pot efectua diverse transformări asupra datelor. De exemplu, să returnăm și valoarea din dicționar după cheie:

dictionary = {"red": "roșu", "blue": "albastru", "green": "verde"}
words = [f"{key}: {dictionary[key]}" for key in dictionary]
print(words)    # ['red: roșu', 'blue: albastru', 'green: verde']

Condiția

Condiția - parametrul condition definește un filtru pentru selectarea elementelor din sursa de date. Aplicăm condiția pentru a specifica selecția, de exemplu, să selectăm doar numerele pare:

numbers = [n for n in range(10) if n % 2 == 0]
print(numbers)      # [0, 2, 4, 6, 8]

Să selectăm doar acele chei din dicționar, a căror lungime este mai mare de 3:

dictionary = {"red": "roșu", "blue": "albastru", "green": "verde"}
words = [f"{key}: {dictionary[key]}" for key in dictionary if len(key) > 3]
print(words)    # ['blue: albastru', 'green: verde']
← Lecția anterioară Lecția următoare →