List comprehensions
Hej, w tym wpisie dowiesz się czym są list comprehensions oraz dlaczego warto ich używać. Mam też nadzieję, że przekonam Cię do wykorzystania ich w przyszłości przy pisaniu własnego kodu
Czym są?
List comprehensions umożliwiają tworzenie list przy pomocy jednej linii kodu. Co jest bardziej pythonowym podejściem niż tworzenie pustej listy i wypełnianie jej wartościami za pomocą pętli.
Załóżmy, że chcemy stworzyć listę zawierającą liczby od 0 do 9.
Możemy to oczywiście zrobić, jak w niemal każdym języku programowania:
for loop
number_list = [] for number in range(10): number_list.append(number) print(number_list) #output: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Jednak Python nie jest jak każdy język programowania. Tworząc listy w Pythonie wykorzystać możesz wspomniane w tytule list comprehensions. Teraz stwórzmy tę samą listę przy ich pomocy:
list comprehension
number_list = [number for number in range(10)] print(number_list) #output: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Przykład ten jest bardzo prosty, lecz dobrze obrazuje budowę list compehensions:
- wyrażenie, czyli co zrobić z elementem pętli (w naszym przypadku po prostu number),
- element iteratora, po słówku for – zmienna number,
- następnie iterowalny obiekt, po którego elementach przechodzimy, w tym przypadku range(10).
Dlaczego warto używać list comprehensions?
Może zastanawiasz się, dlaczego w ogóle korzystać z list comprehensions skoro sposób z pętlami też się sprawdza. Powód jest prosty, warto wykorzystywać potencjał języka, w którym piszesz.
W stosunkowo prostych sytuacjach list comprehensions skracają kod. Są też zgodne z fundamentalnymi zasadami pythona.
Zen of Python
Simple is better than complex.
Inne możliwości list comprehensions
O instrukcjach warunkowych
Użyteczność list comprehensions nie kończy się jedynie na tak prostym przykładzie. Często przy tworzeniu list potrzebować będziesz instrukcji warunkowych. W list comprehensions możesz stosować je z takim samym powodzeniem jak przy 'standardowym’ sposobie tworzenia list.
Zastosujmy tutaj przykład z początku. Tym razem jednak chcemy uzyskać listę tylko z liczbami parzystymi:
for loop
even_number_list = [] for number in range(10): if number % 2 == 0 even_number_list.append(number) print(even_number_list) #output: [0, 2, 4, 6, 8]
list comprehension
number_list = [number for number in range(10) if number % 2 == 0] print(number_list) #output: [0, 2, 4, 6, 8]
Instrukcji warunkowych możemy jednak używać nie tylko na końcu naszych comprehensions, ale także zaraz po naszym wyrażeniu, zmienia to jednak działanie kodu. Nie jest to warunek if w liście, tylko już logika wyrażenia
Łatwiej to sobie zobrazujesz jeśli wykorzystamy przykład z góry. Tym razem jednak chcemy dodać do listy wszystkie liczby, ale nieparzyste zamienić na inną wartość:
number_list = [number if number % 2 == 0 else 'odd' for number in range(10)] print(number_list) #output: [0, 'odd', 2, 'odd', 4, 'odd', 6, 'odd', 8, 'odd']
ten kod dodaje do listy wartość number, jeśli jest ona parzysta, a w innym wypadku dodaje wartosc 'odd’
Zagnieżdżanie
List comprehensions można także zagnieżdżać, w celu tworzenia listy z elementów wielu iterowalnych obiektów. Powiedzmy, że chcemy stworzyć listę wszystkich możliwych połączeń elementów z dwóch list. Możemy to zrobić przy pomocy pętli:
for loop
list1 = [1, 2, 3] list2 = [11, 22, 33]
list3 = [] for num1 in list1: for num2 in list2: list3.append([num1, num2]) print(list3) #output: [[1, 11], [1, 22], [1, 33], [2, 11], [2, 22], [2, 33], [3, 11], [3, 22], [3, 33]]
list comprehension
list3 = [[num1, num2] for num1 in list1 for num2 in list2] print(list3) #output: [[1, 11], [1, 22], [1, 33], [2, 11], [2, 22], [2, 33], [3, 11], [3, 22], [3, 33]]
Zachowaj balans
List comprehensions skróciły nasz kod. Pewnie czujesz jednak, że w ostatnich przykładach wersje z pętlami stawały się jednak tymi bardziej czytelnymi. Nie możemy tutaj zapomnieć również o innych zasadacj pythona.
Zen of Python
Readability counts
Im bardziej skomplikujemy przykłady tym mniej czytelne mogą stać się list comprehensions. Dostosowuj więc swój kod do zadania jakie ma wykonywać.
Wykorzystaj wiedzę
Następnym razem tworząc listę zastanów się czy 'Nie da się tego zrobić bardziej Pythonowo?’, jeśli tak wykorzystaj poznane tutaj list comprehensions. Powodzenia.
Podsumowując
- Pamiętaj o zasadach Zen of Python:
- Simple is better than complex.
- Readability counts.
- Używaj list comprehensions, aby zwiększyć przejżystość i czytelność kodu (tam gdzie to ma sens)
- Wykorzystuj instrukcje warunkowe w obu podanych przykładach
- W razie potrzeby zagnieżdżaj pętle, aby tworzyć kombinacje elementów z kilku iterable
Zdjęcie wyróżniające wykonane przez Denny Müller i zaciągnięte z Unsplash