Python list comprehension: składnia, przykłady i kiedy jej unikać
Poznaj list comprehension w Pythonie krok po kroku: twórz, filtruj i przekształcaj listy w jednej linii, zobacz zmierzone czasy w porównaniu z pętlami i dowiedz się, kiedy pętla for jest czytelniejsza.
- Wzorzec to
[wyrażenie for element in iterowalny if warunek]. - Zwykłe
ifna końcu filtruje;if-elsena początku wybiera jedną z dwóch wartości. - W naszym teście comprehension było o około 37% szybsze niż pętla z
append. - Przy ogromnych danych użyj wyrażenia generatora, a gdy logika wymaga kilku wyraźnych kroków, zwykłej pętli.
Python list comprehension tworzy nową listę z dowolnego obiektu iterowalnego w jednej czytelnej linii. Zamiast tworzyć pustą listę, przechodzić po danych i wywoływać append, opisujesz wynik, który chcesz uzyskać.
Ten poradnik prowadzi od podstawowego wzorca przez filtry i zagnieżdżone pętle po czasy, które zmierzyliśmy sami. Jeśli Python jest dla Ciebie nowy, zacznij od naszego kursu Pythona dla początkujących (po angielsku) i dbaj o porządek w środowisku dzięki poradnikowi o środowiskach wirtualnych (po angielsku).
Składnia list comprehension w Pythonie
Czytaj od lewej do prawej: wyrażenie mówi, jak wygląda każdy nowy element, a część for — skąd elementy pochodzą.
squares = [x * x for x in range(6)]
print(squares) # [0, 1, 4, 9, 16, 25]
names = [" Hi ", " QA "]
clean = [n.strip().lower() for n in names]
print(clean) # ['hi', 'qa']
Ten sam wynik z pętlą wymaga trzech dodatkowych linii. Na tym polega oszczędność, o ile linia pozostaje łatwa do czytania.
Filtrowanie elementów warunkiem
Dodaj if po pętli, aby zostawić tylko elementy spełniające warunek.
evens = [x for x in range(10) if x % 2 == 0]
print(evens) # [0, 2, 4, 6, 8]
Python list comprehension z if-else
Gdy chcesz mieć wartość dla każdego elementu, umieść if-else przed for. To najczęstsze potknięcie początkujących, bo else na końcu jest błędem składni.
labels = ["even" if x % 2 == 0 else "odd" for x in range(4)]
print(labels) # ['even', 'odd', 'even', 'odd']
Zasada praktyczna: if na końcu usuwa elementy, if-else na początku je zmienia. Przy if-else długość listy pozostaje taka sama.
Zagnieżdżone pętle i spłaszczanie
Kilka klauzul for czyta się w tej samej kolejności co zagnieżdżone pętle. Użyj ich do spłaszczenia listy list lub tworzenia par.
matrix = [[1, 2, 3], [4, 5, 6]]
flat = [n for row in matrix for n in row]
print(flat) # [1, 2, 3, 4, 5, 6]
pairs = [(x, y) for x in range(1, 3) for y in "ab"]
print(pairs) # [(1, 'a'), (1, 'b'), (2, 'a'), (2, 'b')]
Aby transponować macierz, zagnieźdź jedno comprehension w drugim: [[r[i] for r in matrix] for i in range(3)] daje [[1, 4], [2, 5], [3, 6]]. Dwa poziomy to praktyczna granica, zanim czytelność spadnie.
Formy słownika, zbioru i generatora
Zmień nawiasy, a ten sam pomysł tworzy inne typy.
lengths = {w: len(w) for w in ["pip", "venv", "uv"]} # {'pip': 3, 'venv': 4, 'uv': 2}
unique = {len(w) for w in ["pip", "venv", "uv", "git"]} # {2, 3, 4}
total = sum(x * x for x in range(1_000_000)) # generator, no list
Same typy porównasz w naszym poradniku o listach, krotkach, zbiorach i słownikach (po angielsku).
Szybkość i pamięć: co zmierzyliśmy
Zmierzyliśmy każdą wersję w Pythonie 3.13.6 na 100 000 liczb całkowitych, biorąc najlepszy wynik z pięciu uruchomień. Twoje liczby będą inne, ale kolejność jest stabilna.
| Zadanie | Czas |
|---|---|
Pętla z append (podwojenie każdego elementu) | 5,18 ms |
| List comprehension (podwojenie każdego elementu) | 3,25 ms |
list(map(lambda ...)) | 6,50 ms |
| Filtrowanie parzystych pętlą | 3,62 ms |
| Filtrowanie parzystych przez comprehension | 3,43 ms |
Comprehension wyraźnie wygrywa z pętlą z append, ale różnica maleje, gdy większość czasu pochłania warunek. Pod względem pamięci lista miliona podwojonych liczb zajęła około 8,4 MB, a odpowiadający jej generator tylko 200 bajtów, ponieważ tworzy wartości po jednej.
Kiedy nie używać list comprehension
- Potrzebujesz tylko efektów ubocznych, takich jak wypisywanie lub zapis. Użyj zwykłej pętli; comprehension zbudowałoby bezużyteczną listę.
- Logika ma kilka kroków. Jeśli potrzebujesz drugiej zmiennej lub
try, napisz pętlę albo małą funkcję. - Dane są ogromne. Użyj wyrażenia generatora, aby Python nie trzymał całej listy w pamięci.
- Potrzeba więcej niż dwóch klauzul
for. Podziel na nazwane kroki dla kolejnego czytelnika.
Podsumowanie
Używaj Python list comprehension, gdy krótka linia dokładnie wyraża to, co chcesz, a pętli, gdy tak nie jest. Zacznij od podstawowego wzorca, dodaj jeden filtr, a potem ćwicz formę if-else, aż kolejność stanie się naturalna.
Najczęściej zadawane pytania
Czym jest list comprehension w Pythonie?
To zwięzły sposób tworzenia listy przez zastosowanie wyrażenia do każdego elementu obiektu iterowalnego, z opcjonalnym warunkiem filtrującym.
Jak użyć if-else w list comprehension?
Umieść wyrażenie warunkowe przed klauzulą for, na przykład ["even" if x % 2 == 0 else "odd" for x in nums]. Prosty filtr używa jednego if po pętli.
Czy list comprehension jest szybsze niż pętla for?
Zwykle tak. W naszym teście na 100 000 elementów było o około 37% szybsze niż pętla z append, ale najpierw powinna decydować czytelność.
Czym różni się list comprehension od wyrażenia generatora?
List comprehension buduje całą listę w pamięci naraz. Wyrażenie generatora używa nawiasów okrągłych i tworzy po jednej wartości, co oszczędza pamięć przy dużych danych.
Czy można zagnieżdżać list comprehension?
Tak, do spłaszczania lub transponowania macierzy. Ogranicz się do dwóch poziomów i przejdź na pętlę, jeśli trudno to czytać.
Ucz się dalej (artykuły po angielsku)
Potrzebujesz pomocy w testowaniu, WordPressie lub SEO?
Pomagamy zespołom dostarczać lepsze oprogramowanie i rozwijać ich strony. Opowiedz, nad czym pracujesz, a zaproponujemy jasny następny krok.
Więcej poradników na testowanie, sztuczna inteligencja i nowoczesny rozwój
Podobał Ci się ten artykuł? Wybierz temat i przejdź bezpośrednio do naszych najnowszych tutoriali.
Wyjaśnienie halucynacji AI: dlaczego modele językowe tworzą rzeczy i jak je zmniejszyć
Wyjaśniono halucynacje AI: czym są, dlaczego powstają w modelach językowych, typowe typy, jak je zredukować za pomocą uziemień i podpowiedzi oraz pr…
Przeczytaj artykuł →DevOpsWyjaśnienie zmiennych środowiskowych: pliki .env, sekrety i konfiguracja wykonana prawidłowo
Zmienne środowiskowe wyjaśnione na przykładach Pythona, które przeprowadziliśmy: ich odczytywanie i ustawianie, dlaczego każda wartość jest ciągiem …
Przeczytaj artykuł →Tworzenie oprogramowaniaWyjaśnienie ograniczenia szybkości interfejsu API: algorytmy, nagłówki i obsługa błędów 429
Ograniczanie szybkości API wyjaśnione za pomocą przeprowadzonej przez nas symulacji: zasobnik tokenów, stałe okno, przesuwane okno, 429 odpowiedzi, …
Przeczytaj artykuł →Automatyzacja testówWyśmiewanie w Pythonie: unittest.mock, patch i błędy, które sprawiają, że testy kłamią
Wyśmiewanie w Pythonie za pomocą unittest.mock, przetestowane: Mock i zwracana wartość, efekt uboczny, łatanie tam, gdzie używana jest nazwa, specyf…
Przeczytaj artykuł →Testowanie oprogramowaniaWyjaśnienie zasięgu kodu: pokrycie linii i oddziału oraz co naprawdę oznacza 100%
Wyjaśnienie pokrycia kodu za pomocą prawdziwego pliku cover.py: pokrycie linii, gałęzi i warunków, przeczytanie raportu, dlaczego 100% pokrycia może…
Przeczytaj artykuł →Bazy danych i SQLDELETE vs TRUNCATE vs DROP w SQL: różnice, wycofywanie i kiedy używać każdego z nich
DELETE vs TRUNCATE vs DROP wyjaśnione za pomocą przetestowanego SQL: co każdy usuwa, wycofywanie, wyzwalacze, resetowanie tożsamości, prędkość i czy…
Przeczytaj artykuł →Bazy danych i SQLWyjaśnienie widoków SQL: tworzenie, używanie i unikanie pułapek wraz z przykładami
Widoki SQL wyjaśnione za pomocą zapytań, które uruchomiliśmy: tworzenie widoku, wyniki na żywo, ukrywanie kolumn, wydajność, widoki z możliwością ak…
Przeczytaj artykuł →Tworzenie oprogramowaniaInterfejs TypeScript a typ: rzeczywiste różnice, testowane za pomocą kompilatora
Interfejs TypeScript a typ, sprawdzony z prawdziwym kompilatorem: co oba mogą zrobić, co tylko jeden, łączenie deklaracji, rozszerzenia a przecięcia…
Przeczytaj artykuł →Tworzenie oprogramowaniaPython *args i **kwargs wyjaśnione: elastyczne funkcje z przejrzystymi przykładami
Python *args i **kwargs wyjaśnione za pomocą uruchomionego przez nas kodu: pakowanie i rozpakowywanie, kolejność parametrów, argumenty zawierające t…
Przeczytaj artykuł →Tworzenie oprogramowaniaFunkcje Lambda w Pythonie: składnia, rzeczywiste zastosowania i kiedy ich nie używać
Funkcje lambda w Pythonie wyjaśnione za pomocą uruchomionego przez nas kodu: składnia, sortowanie za pomocą klucza, mapa i filtr, domknięcia, pułapk…
Przeczytaj artykuł →Sztuczna inteligencjaKim są agenci AI? Jak one działają, dzięki prostej pętli agenta, którą możesz uruchomić
Kim są agenci AI? Prosty przewodnik po pętli agenta, narzędziach, pamięci i poręczach, z małą pętlą w Pythonie, którą uruchomiliśmy, prawdziwymi zag…
Przeczytaj artykuł →DevOpsMonitorowanie a obserwowalność: prawdziwa różnica z logami, wskaźnikami i śladami
Wyjaśnienie monitorowania a obserwowalności: znane i nieznane awarie, dzienniki, metryki i ślady, opis incydentu przy kasie, złote sygnały, OpenTele…
Przeczytaj artykuł →DevOpsWoluminy platformy Docker a mocowania powiązań: utrwalanie danych kontenera we właściwy sposób
Wyjaśniono woluminy Dockera a montowanie powiązań: dlaczego dane kontenera znikają, nazwane woluminy, montowanie powiązań, tmpfs, przykłady tworzeni…
Przeczytaj artykuł →Automatyzacja testówTDD vs BDD: kluczowe różnice, jedna funkcja zbudowana w obie strony i kiedy używać każdej z nich
TDD vs BDD wyjaśnione za pomocą jednej funkcji rabatowej zbudowanej w obie strony: refaktoryzacja czerwono-zielona z uruchomionym przez nas kodem, s…
Przeczytaj artykuł →Tworzenie oprogramowaniaGit merge vs rebase: różnice, przykłady i kiedy czego używać
Git merge vs rebase wyjaśnione na prawdziwym wyniku logu, z tabelą porównawczą, złotą zasadą rebase i bezpiecznym procesem pracy zespołu.
Przeczytaj artykuł →Tworzenie oprogramowaniaPython list comprehension: składnia, przykłady i kiedy jej unikać
Python list comprehension wyjaśnione: składnia, filtrowanie, if-else, zagnieżdżone pętle, zmierzone czasy i sytuacje, w których zwykła pętla for jes…
Przeczytaj artykuł →Bazy danych i SQLSQL JOIN – wyjaśnienie z przykładami (Inner, Left, Right, Full)
Zrozum złączenia SQL krok po kroku na przykładowych tabelach i zapytaniach: INNER, LEFT, RIGHT, FULL, CROSS i SELF, plus typowe błędy i wskazówki wy…
Przeczytaj artykuł →