Blog JSystems - z miłości do programowania

Listy składane



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? :)

Przyjdź do nas na szkolenie z języka Python! Mamy szereg szkoleń w ofercie, od podstawowych po aplikacje webowe z użyciem Django, analizę danych, tesowanie, machine learning i wiele innych.
Sprawdź dostępne szkolenia Python
Zapisz się do newslettera aby otrzymywać najnowsze świeżynki pojawiające się na blogu!