Blog JSystems - uwalniamy wiedzę!

Szukaj
Animacja listy składanej - transformacja elementów
Lista składana - transformacja wszystkich elementów w jednej linii

W praktyce programisty często zdarza się sytuacja w której na podstawie zawartości jednej listy tworzysz inną listę, często filtrując na podstawie zawartości. Przyjrzyjmy się jak to można zrobić przy pomocy dotychczas znanych metod i porównajmy to z zastosowaniem list składanych.

Naszym celem jest na podstawie 20 liczb w zakresie 1-20 wygenerować listę elementów parzystych z tego zbioru. Przede wszystkim potrzebujemy tej źródłowej listy:

liczby=[]
for x in range(1,21): liczby.append(x)
print(liczby)

Nasz zestaw danych wejściowych wygląda tak:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]

Sprawdźmy jak wybralibyśmy z tej listy liczby parzyste i dodali je do innej listy dotychczas znanymi metodami:

parzyste=[]
for i in liczby:
    if(i%2==0):
        parzyste.append(i)
print(parzyste)

Jest to jakiś sposób, ale też jest sposób krótszy z użyciem list składanych właśnie:

parzyste=[i for i in liczby if i%2==0]
print(parzyste)

Skutek działania powyższego kodu jest taki sam jak tego poprzedniego. Co tu się stało? Zmienna "i" reprezentuje każdy element listy podanej w klauzuli "in liczby". Czyli i to po prostu kolejne liczby z naszej listy liczb. Tak więc zapis:

parzyste=[i for i in liczby]

oznaczałby przypisanie do nowej listy o nazwie "parzyste" wszystkich liczb ze zbioru "liczby". Konstrukcja "for i in liczby" powinna Ci już byc znana. Oznacza ona "dla każdego elementu i ze zbioru liczby". Co oznacza to "i" przed "for"? Tutaj określamy co ma trafić do listy docelowej - czy źródłowy element, czy też może w jakiś sposób przetworzony. Rozważmy taki przykład:

parzyste=[i for i in liczby]
print(parzyste)

Sprawdzenie zawartości listy "parzyste" pokazuje nam tę samą zawartość co w liście "liczby":

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]

Zmodyfikujemy teraz nieco nasz kod:

parzyste=[i*10 for i in liczby]
print(parzyste)

Sprawdźmy co teraz znajduje się na liście "parzyste":

[10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160, 170, 180, 190, 200]

Co tu się stało? Na początku klazuli zamiast "i for i in" jest "i*10 for i in". Pojawiło się dodatkowe mnożenie. Jak widzimy, do listy docelowej trafiły elementy z listy pierwotnej pomnożone przez 10. Taką właśnie funkcję spełnia element przed "for". Pozwala Ci na jakieś modyfikacje elementów które trafiają do docelowej listy. To może być cokolwiek - mnożenie jak tu, jakaś unifikacja tekstów czy zastosowanie dowolnej innej funkcji która ma zadziałać na elemencie zanim ten trafi do docelowej listy.

Połączmy to teraz i wyjaśnijmy krok po kroku:

parzyste=[i for i in liczby if i%2==0]
print(parzyste)
  1. "parzyste=" - powstanie nowa lista o nazwie parzyste do której przypiszemy....
  2. "[i for" - każdy element z listy pierwotnej trafia do docelowej bez żadnej modyfikacji.
  3. "i in liczby" - przetwarzamy elementy z listy "liczby" i do każdego z nich odnosimy się per "i"
  4. "if i%2==0]" - do docelowej listy trafiają tylko liczby parzyste-czyli podzielne przez 2 bez reszty

A teraz całość razem: "Stwórz listę 'parzyste' do której trafią elementy i bez żadnej modyfikacji z listy 'liczby', które spełniają warunek podzielności przez 2 bez reszty" :) Skoro już tak dobrze się bawimy, to przeróbmy cały nasz kod dalej:

liczby=[]
for x in range(1,21): liczby.append(x)
print(liczby)
parzyste=[i*10 for i in liczby if i%2==0]
print(parzyste)

Na ten moment wygląda to tak... czyli paskudnie. Skoro już wiemy jak działają listy składane, to postarajmy się to maksymalnie skrócić. Zacznijmy od stworzenia listy liczb w określonym zakresie za pomocą list składanych. Zamiast zapisu:

liczby=[]
for x in range(1,21): liczby.append(x)

Zapiszmy to tak:

liczby=[i for i in range(1,21)]

Co się stało się? Stworzyłem listę 'liczby' do której przypisałem bez żadnej modyfikacji elementy z zakresu 1-20. Idźmy krok dalej. Skoro zależy mi na tym by po prostu wyświetlić listę liczb parzystych w określonym zakresie, to wcale nie potrzebuję 2 list, nazywania ich i ich przepisywania. Równie dobrze mogę zrobić to tak:

print(  [i for i in range(1,21) if i%2==0]  )

Czyż Python nie jest piękny? :)

Szkolenie Python od podstaw, przez analizę danych, do machine learning w JSystems

Ten kurs daje Ci solidne podstawy Pythona. Jeśli chcesz pójść dalej i pod okiem trenera dojść od pierwszej linijki kodu do własnego modelu uczenia maszynowego, sprawdź nasze pięciodniowe szkolenie Python od podstaw, przez analizę danych, do machine learning. Pierwsze trzy dni to Python w praktyce: typy i kolekcje, instrukcje warunkowe i pętle, funkcje, moduły i pakiety, pliki tekstowe, usługi sieciowe oraz praca z bazą PostgreSQL. Czwarty dzień to analiza danych w pandas (wczytywanie CSV, TSV i XLS, filtrowanie, agregacje, statystyki) i wizualizacja w Matplotlib, Seaborn oraz Plotly. Piąty dzień to uczenie maszynowe w scikit-learn: regresja liniowa i logistyczna, drzewa decyzyjne, las losowy, XGBoost, walidacja predykcji, dobór hiperparametrów i przeciwdziałanie przeuczeniu. Szkolenie ma terminy gwarantowane, czyli odbywa się niezależnie od wielkości grupy.

Szkolenie Python od podstaw, przez analizę danych, do machine learning

To szkolenie może być dofinansowane dla Ciebie z KFS lub BUR.

★★★★★Średnia ocena naszych szkoleń w Google: 5/5

Najczęściej zadawane pytania

Czym jest lista składana w Pythonie?
To sposób na utworzenie nowej listy na podstawie innej w jednej linii, zamiast pisać pętlę for z metodą append. Pozwala jednocześnie przekształcać elementy i filtrować je warunkiem, dzięki czemu kod jest krótszy i czytelniejszy niż klasyczna pętla.
Co oznacza wyrażenie przed słowem for w liście składanej?
Element zapisany przed for określa, co dokładnie trafi do listy docelowej. Może to być element źródłowy bez zmian albo element przetworzony, na przykład pomnożony przez dziesięć. To miejsce służy do dowolnej modyfikacji wartości, zanim znajdzie się ona w nowej liście.
Jak dodać filtr do listy składanej?
Na końcu listy składanej dopisujemy warunek if. W zapisie [i for i in liczby if i % 2 == 0] do listy trafiają tylko elementy spełniające warunek, tutaj liczby podzielne przez dwa bez reszty. Filtr decyduje, które elementy z listy źródłowej znajdą się w wynikowej.
Czy w liście składanej można od razu wygenerować zakres liczb?
Tak, zamiast tworzyć listę pętlą i metodą append, można zapisać ją jako [i for i in range(1, 21)]. Można też połączyć generowanie zakresu z filtrowaniem i wypisaniem bez tworzenia zmiennych pośrednich, na przykład drukując od razu liczby parzyste z danego zakresu.

Komentarze (0)

Musisz być zalogowany by móc dodać komentarz. Zaloguj się przez Google

Brak komentarzy...