❄️ Listy składane
Listy składane (list comprehension)
Lista składana to wyrażenie, które pozwala na tworzenie nowych list w zwięzły sposób, zwykle z użyciem pętli. To elegancka składnia w Pythonie, która łączy w sobie mapowanie i filtrowanie elementów.
Podstawowa składnia
kwadraty = [x ** 2 for x in range(6)]
print(kwadraty) # [0, 1, 4, 9, 16, 25]
Lista składana z warunkiem
Można dodać warunek filtrujący elementy:
liczby = [1, 2, 3, 4, 5, 6]
parzyste = [liczba for liczba in liczby if liczba % 2 == 0]
print(parzyste) # [2, 4, 6]
Lista składana z wyrażeniem warunkowym (ternary operator)
liczby = [1, 2, 3, 4, 5, 6]
parzystosc = ['parzysta' if liczba % 2 == 0 else 'nieparzysta' for liczba in liczby]
print(parzystosc) # ['nieparzysta', 'parzysta', 'nieparzysta', 'parzysta', 'nieparzysta', 'parzysta']
Zagnieżdżone pętle
Listy składane mogą zawierać zagnieżdżone pętle, pozwalając na generowanie kombinacji elementów:
# Iloczyn kartezjański (każdy z każdym)
pary = [(x, y) for x in [1, 2, 3] for y in [10, 20]]
print(pary) # [(1, 10), (1, 20), (2, 10), (2, 20), (3, 10), (3, 20)]
# Flattenowanie listy (spłaszczanie)
lista_list = [[1, 2, 3], [4, 5], [6, 7, 8, 9]]
spłaszczona = [element for podlista in lista_list for element in podlista]
print(spłaszczona) # [1, 2, 3, 4, 5, 6, 7, 8, 9]
Zagnieżdżone listy składane
Można tworzyć struktury wielowymiarowe:
# Macierz 3x3
macierz = [[j for j in range(3)] for i in range(3)]
print(macierz) # [[0, 1, 2], [0, 1, 2], [0, 1, 2]]
Porównanie z tradycyjnym podejściem
# Tradycyjne podejście
kwadraty = []
for x in range(6):
kwadraty.append(x ** 2)
# Lista składana - zwięźlejsza i czytelniejsza
kwadraty = [x ** 2 for x in range(6)]
Zalety list składanych
- Zwięzłość - mniej kodu do napisania
- Czytelność - łatwiej zrozumieć intencję
- Wydajność - często szybsze niż tradycyjne pętle
- Ekspresywność - Pythonowy, idiomatyczny sposób
Uwaga
Listy składane z zagnieżdżonymi pętlami i warunkami mogą być trudne do odczytania. Jeśli lista składana staje się zbyt skomplikowana, warto rozważyć powrót do tradycyjnego podejścia lub podział na kilka mniejszych list składanych.
📝 Zadania
Stwórz plik python1course/zaj02/listy_skladane.py i wykonaj w nim poniższe zadania.
-
Stwórz listę zawierającą kwadraty liczb od 1 do 20, które są podzielne przez 3.
-
Masz dwie listy
imiona = ['Anna', 'Jan', 'Ewa', 'Piotr']ioceny = [5, 4, 3, 5]. Stwórz listę słowników, gdzie każdy słownik zawiera pary klucz-wartość dla imienia i oceny. Można skorzystać z funkcjizip(). -
Napisz listę składaną, która dla każdej liczby od 1 do 50 zwraca jej reprezentację stringową (
str) tylko wtedy, gdy liczba jest równocześnie:- Wielokrotnością 3,
- Wielokrotnością 5.
-
Masz listę list:
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]. Stwórz listę składaną, która spłaszczy tę strukturę (utworzy jedną płaską listę), a następnie podnieś każdy element do kwadratu. -
Stwórz listę składaną, która dla każdej liczby z zakresu 1-100 zwraca jej kwadrat, ale tylko jeśli pierwiastek kwadratowy z tej liczby jest liczbą całkowitą (np. 1, 4, 9, 16...).
Wskazówka
Możesz użyć
math.sqrt()z modułumathi sprawdzić czy wynik jest liczbą całkowitą używając porównania== int(...)lub operacji modulo na zmiennoprzecinkowej wersji.