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)
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? :)
Komentarze (0)
Brak komentarzy...