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 tego, aby wykorzystać je w przyszłości, podczas pisania własnego kodu.

list comprehensions to kolejny wpis z cyklu Iterowanie w Pythonie

Czym są list comprehensions?

List comprehensions umożliwiają w Pythonie tworzenie list za pomocą jednej linii kodu. To jest bardziej pythonowe niż tworzenie pustej listy i wypełnianie jej wartościami przy użyciu pętli.

Załóżmy, że chcemy stworzyć listę zawierającą liczby od 0 do 9.
Możemy to oczywiście zrobić tak, 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, za ich pomocą, możesz stworzyć listę:

list comprehension:

number_list = [number for number in range(10)]
print(number_list)
#output: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

Chociaż przykład jest bardzo prosty, to 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 masz korzystać z list comprehensions skoro sposób z pętlami 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.

Instrukcje warunkowe w list comprehensions

Użyteczność list comprehensions nie kończy się 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 przykład z początku. Jednak tym razem 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 używać nie tylko na końcu naszych comprehensions, ale także zaraz po wyrażeniu, co zmienia działanie kodu. Nie jest to warunek if w liście, ale logika wyrażenia.

Łatwiej to sobie zobrazować, jeśli powrócimy do przykładu z góry. Jednak tym razem dodamy do listy wszystkie liczby, a te nieparzyste zamienimy 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 wartość 'odd’.

Zagnieżdżanie list comprehensions

List comprehensions można także zagnieżdżać. Dzięki czemu tworzymy listę 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ć za pomocą 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 w używaniu list comprehensions

List comprehensions skróciły nasz kod. Zapewne zauważyłeś, że w ostatnich przykładach wersje z pętlami stawały się tymi bardziej czytelnymi. Istotne są również inne zasady Pythona, o których nie możemy zapomnieć

Zen of Python

Readability counts

Im bardziej komplikujemy 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, kiedy będziesz tworzyć listę, zastanów się czy nie da się tego zrobić bardziej pythonowo. Jeśli tak, to super. Będziesz mógł wykorzystać 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ć przejrzystość i czytelność kodu (tam, gdzie ma to sens).
  • W obu podanych przykładach wykorzystuj instrukcje warunkowe.
  • W razie potrzeby zagnieżdżaj pętle. Dzięki temu stworzysz kombinacje elementów z kilku iterable.


Zdjęcie wyróżniające wykonane przez Denny Müller i zaciągnięte z Unsplash

Scroll to Top