Przejdź do głównej treści
eLearner.app
Moduł 6 · Lekcja 1 z 421/36 w kursie~12 min
Lekcje modułu (1/4)

List comprehension

Wyrażenie listowe (list comprehension) to konstrukcja, która buduje nową listę poprzez zastosowanie przekształcenia (i opcjonalnie filtra) do każdego elementu obiektu iterowalnego. Jest to pythonowy sposób na zapisanie konstrukcji for + append w jednej linii.

Python
# styl imperatywny (rozwlekły)
quadrati = []
for n in range(5):
    quadrati.append(n * n)

# styl pythonowy
quadrati = [n * n for n in range(5)]
# [0, 1, 4, 9, 16]

Pełna składnia

Python
[espressione for elemento in iterabile if condizione]
  • expression: co ma zostać wstawione do wynikowej listy
  • for element in iterable: pętla źródłowa
  • if condition (opcjonalnie): zachowuje tylko te elementy, które spełniają warunek
Python
pari = [n for n in range(10) if n % 2 == 0]
# [0, 2, 4, 6, 8]

maiuscole = [p.upper() for p in ["ciao", "mondo"]]
# ['CIAO', 'MONDO']

lunghe = [p for p in ["a", "bb", "ccc", "dddd"] if len(p) >= 3]
# ['ccc', 'dddd']

if/else wewnątrz wyrażenia (operator warunkowy)

Aby dokonać warunkowej transformacji (zamiast filtrowania), umieść wyrażenie warunkowe PRZED słowem kluczowym for:

Python
[n if n > 0 else 0 for n in [-2, -1, 0, 1, 2]]
# [0, 0, 0, 1, 2]

Wielokrotne pętle for: iloczyn kartezjański

Wewnątrz wyrażenia możesz zagnieżdżać pętle for:

Python
coppie = [(x, y) for x in range(3) for y in range(2)]
# [(0,0), (0,1), (1,0), (1,1), (2,0), (2,1)]

Kolejność pętli for to "od zewnętrznej do wewnętrznej", dokładnie tak jak w tradycyjnie zagnieżdżonych pętlach.

Kiedy NIE używać wyrażenia listowego

  • Złożona logika z wieloma zagnieżdżonymi warunkami if/else → użyj tradycyjnej pętli.
  • Efekty uboczne (wypisywanie na ekran, zapis do pliku) → zwykła pętla, nie wyrażenie listowe.
  • Więcej niż 2 poziomy zagnieżdżenia → tradycyjna pętla z jasną nazwą jest niemal zawsze czytelniejsza.

Zagnieżdżone wyrażenia listowe

Możesz łączyć wiele pętli for wewnątrz jednego wyrażenia listowego. Na przykład, aby spłaszczyć macierz (listę list) do pojedynczej płaskiej listy, możesz napisać:

Python
matrix = [[1, 2], [3, 4]]
flat = [item for row in matrix for item in row]
# result: [1, 2, 3, 4]

Kolejność pętli odzwierciedla dokładnie kolejność zagnieżdżania tradycyjnych pętli for.

Spróbuj sam

Ćwiczenie#python.m6.l1.e1
Próby: 0Ładowanie...

Mając daną listę `nums = [1, 2, 3, 4, 5, 6]`, utwórz listę `even_squares` zawierającą kwadraty tylko parzystych liczb. Oceń `even_squares`.

Ładowanie edytora...
Pokaż wskazówkę

Warunek if n % 2 == 0 na końcu.

Rozwiązanie dostępne po 3 próbach

Ćwiczenie powtórzeniowe

Ćwiczenie#python.m6.l1.e2
Próby: 0Ładowanie...

Mając daną listę `words = ['Ciao', 'Mondo', 'Python', 'Java']`, utwórz listę `lengths` zawierającą długości KAŻDEGO słowa oraz listę `short_words` zawierającą tylko słowa krótsze niż 5 znaków. Oceń krotkę `(lengths, short_words)`.

Ładowanie edytora...
Pokaż wskazówkę

Zastosuj dwa osobne wyrażenia listowe.

Rozwiązanie dostępne po 3 próbach

Dodatkowe wyzwanie

Ćwiczenie#python.m6.l1.e3
Próby: 0Ładowanie...

Użyj wyrażenia listowego do obliczenia kwadratów tylko parzystych liczb całkowitych z przedziału od 1 do 10 włącznie. Zapisz wynikową listę w zmiennej `even_squares` i ją oceń.

Ładowanie edytora...
Pokaż wskazówkę

Użyj range(1, 11) do iteracji, if x % 2 == 0 do filtrowania, a x**2 jako wyrażenia.

Rozwiązanie dostępne po 3 próbach