Python list comprehension: składnia, przykłady i kiedy jej unikać

  1. Strona główna
  2. Blog
  3. Tworzenie oprogramowania
Tworzenie oprogramowania

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.

7 min czytania
Python list comprehension: składnia, przykłady i kiedy jej unikać
Najważniejsze
  • Wzorzec to [wyrażenie for element in iterowalny if warunek].
  • Zwykłe if na końcu filtruje; if-else na 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.

ZadanieCzas
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 comprehension3,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)

Współpracuj ze Stack Quora

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.

Czytaj dalej

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.

Sztuczna inteligencja

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ł →
DevOps

Wyjaś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 oprogramowania

Wyjaś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ów

Wyś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 oprogramowania

Wyjaś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 SQL

DELETE 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 SQL

Wyjaś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 oprogramowania

Interfejs 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 oprogramowania

Python *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 oprogramowania

Funkcje 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 inteligencja

Kim 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ł →
DevOps

Monitorowanie 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ł →
DevOps

Woluminy 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ów

TDD 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 oprogramowania

Git 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 oprogramowania

Python 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 SQL

SQL 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ł →