List comprehension w Pythonie – składnia i praktyczne przykłady
List comprehension to jedna z najbardziej charakterystycznych i cenionych konstrukcji języka Python. Pozwala tworzyć nowe listy w jednej, zwartej linii kodu – zamiast pisać tradycyjną pętlę for z metodą append(), możesz zapisać to samo działanie znacznie krócej i czytelniej.
Definicja
List comprehension to zwięzła składnia Pythona, która pozwala budować nową listę poprzez zastosowanie wyrażenia do każdego elementu kolekcji – opcjonalnie z filtrowaniem warunkowym – w jednej linii kodu. Odpowiada na pytanie: jak szybko i czytelnie przetworzyć dane w liście?
Tradycyjna Pętla vs. List Comprehension
Spójrzmy na przykład: chcemy stworzyć listę kwadratów liczb od 0 do 9.❌ Tradycyjna pętla for
Python
kwadraty = []
for i in range(10):
kwadraty.append(i ** 2)
✅ List Comprehension
Python
kwadraty = [i ** 2 for i in range(10)]
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
Wynik obu operacji jest identyczny. List comprehension jest krótsze, bardziej zwięzłe i – gdy się je pozna – po prostu bardziej czytelne.
Składnia krok po kroku
Ogólna postać list comprehension wygląda następująco:Python – składnia podstawowa
[wyrażenie for element in iterowalny_obiekt]
Z opcjonalnym warunkiem filtrującym:
Python – składnia z warunkiem
[wyrażenie for element in iterowalny_obiekt if warunek]
Składnię można czytać w tej kolejności: najpierw wyrażenie wynikowe, potem pętla i ewentualny warunek:
1
wyrażenie
Co zrobić z elementem – np. pomnożyć, zamienić na wielkie litery, obliczyć wartość.
2
for element in kolekcja
Iteruj po każdym elemencie wskazanej kolekcji (lista, zakres, string itd.).
3
if warunek (opcjonalnie)
Uwzględnij tylko elementy spełniające podany warunek – reszta jest pomijana.
Praktyczne Przykłady
Filtrowanie – tylko liczby parzyste
Python
parzyste = [i for i in range(20) if i % 2 == 0]
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
Zamiana tekstu na wielkie litery
Python
imiona = ["anna", "tomek", "kasia"]
wielkie = [imie.upper() for imie in imiona]
[‘ANNA’, ‘TOMEK’, ‘KASIA’]
Filtrowanie długich słów (ponad 4 znaki)
Python
slowa = ["pies", "kot", "komputer", "dom", "python"]
dlugie = [s for s in slowa if len(s) > 4]
[‘komputer’, ‘python’]
Przeliczenie temperatur z Celsjusza na Fahrenheita
Python
celsjusze = [0, 10, 20, 30, 37, 100]
fahrenheity = [c * 9/5 + 32 for c in celsjusze]
[32.0, 50.0, 68.0, 86.0, 98.6, 212.0]
Zagnieżdżone List Comprehension
Możemy użyć list comprehension wewnątrz innego list comprehension. Przydaje się to na przykład do spłaszczania macierzy (listy list):Python
macierz = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
splaszczona = [el for wiersz in macierz for el in wiersz]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
⚠️ Uwaga na czytelność! Zagnieżdżone list comprehension mogą szybko stać się trudne do odczytania. Przy wielopoziomowej, trudnej do śledzenia logice rozważ tradycyjną pętlę for. Czytelność kodu jest ważniejsza niż jego zwięzłość.
Dict Comprehension i Set Comprehension
Ta sama idea działa również dla słowników i zbiorów – wystarczy zmienić nawiasy.Dict comprehension – słownik liczba → jej kwadrat
Python
kwadraty = {i: i**2 for i in range(6)}
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25}
Set comprehension – zbiór unikalnych długości słów
Python
slowa = ["ala", "ma", "kota", "psa"]
dlugosci = {len(s) for s in slowa}
Przykładowy wynik: {2, 3, 4} (kolejność może się różnić)
Różnica w nawiasach: [ ] = lista, { klucz: wartość } = słownik, { wartość } = zbiór, ( ) = generator (nie tworzy listy od razu – oszczędza pamięć).
Kiedy Używać, a Kiedy Nie?
| Sytuacja | Rekomendacja | Dlaczego? |
|---|---|---|
| Prosta transformacja listy | ✅ List comprehension | Krótko, czytelnie, pythonowo |
| Filtrowanie z jednym warunkiem | ✅ List comprehension | Jeden wiersz zamiast trzech |
| Skomplikowana logika wielowarunkowa | ⚠️ Tradycyjna pętla | Czytelność ważniejsza niż zwięzłość |
| Zagnieżdżenie 3+ poziomów | ⚠️ Tradycyjna pętla | LC staje się nieczytelne |
| Duże dane, zależy nam na pamięci | 💡 Generator expression | Elementy generowane jeden po drugim |
Generator expression – oszczędność pamięci
Jeśli pracujesz z milionami elementów, użyj nawiasów okrągłych zamiast kwadratowych – zamiast tworzyć całą listę w pamięci, Python będzie generować elementy jeden po drugim:Python – generator expression
kwadraty = (i ** 2 for i in range(1_000_000)) # nawiasy okrągłe!
List Comprehension a Inne Techniki
| Technika | Składnia | Zwraca | Kiedy używać? |
|---|---|---|---|
| List comprehension | [x for x in ...] |
lista | Standardowe przetwarzanie list |
| Dict comprehension | {k: v for ...} |
słownik | Budowanie słowników dynamicznie |
| Set comprehension | {x for x in ...} |
zbiór (unikalne) | Usuwanie duplikatów |
| Generator expression | (x for x in ...) |
generator | Duże dane, oszczędność pamięci |
| Pętla for + append | klasyczna pętla | lista | Złożona logika, wiele kroków |
Podsumowanie – co warto zapamiętać
- List comprehension tworzy nową listę w jednej linii kodu – zamiast pętli for z append()
- Składnia: [wyrażenie for element in kolekcja if warunek] – warunek jest opcjonalny
- Czytaj od lewej do prawej: „weź wyrażenie, dla każdego elementu z kolekcji, jeśli warunek”
- Ta sama idea działa dla słowników (dict comprehension) i zbiorów (set comprehension)
- Przy dużych danych użyj generator expression z nawiasami okrągłymi – oszczędza pamięć
- Gdy logika staje się skomplikowana – wróć do tradycyjnej pętli. Czytelność > zwięzłość
Przeczytaj również
Ładowanie artykułów…