image for list comprehension article
BiteSize, Technicznie

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

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *