Blog JSystems - uwalniamy wiedzę!

Szukaj

map() i filter(), w skrócie

Przekształcenie i filtrowanie listy:

liczby = [1, 2, 3, 4]
kwadraty = list(map(lambda x: x**2, liczby))
parzyste = list(filter(lambda x: x % 2 == 0, liczby))
Animacja map i filter - przetwarzanie kolekcji
map przekształca każdy element, filter wybiera tylko pasujące

Funkcja map

Funkcja "map" służy do stosowania funkcji na każdym z elementów listy. Poniższy kod powoduje przetworzenie listy "liczby" w taki sposób, by do listy "parzyste" trafiły wartości z listy "liczby" pomnożone przez 2.

liczby=[i for i in range(1,11)]
parzyste=list(map(lambda x:x*2,liczby))
print(parzyste)

Wynik działania funkcji:

[2, 4, 6, 8, 10, 12, 14, 16, 18, 20]

W zasadzie interesować nas będzie tylko jedna linia z kodu:

parzyste=list(map(lambda x:x*2,liczby))

Element list(.......) powoduje oczywiście powstanie listy. Samo wywołanie funkcji map to:

map(lambda x:x*2,liczby)

Do tej funkcji trafiają dwa parametry - funkcja do wykonania (zaraz do tego wrócę) i lista źródłowa. Co oznacza ten tajemniczy zapis?:

lambda x:x*2

Jest to tak zwane wyrażenie lambda. Polega to w skrócie na tym, że możesz podać dynamicznie treść funkcji która ma zostać wykonana. W tym przypadku musimy podać treść funkcji która zostanie wykonana na każdym z elementów listy źródłowej. Zapis "x:" oznacza że ta dynamiczna funkcja przyjmuje jeden parametr, a wewnątrze tej funkcji będę go nazywał "x". Fragment "x*2" określa sposób przetworzenia tego elementu podanego przez parametr, zanim zostanie on zwrócony.

Zasadniczo zapis:

lambda x:x*2

Byłby odpowiednikiem

def funkcja(x):
    return x*2

Czyli na każdym elemencie z listy źródłowej zadziała taka funkcja, a element po przetworzeniu trafi do listy docelowej. W zasadzie ten zapis:

parzyste=list(map(lambda x:x*2,liczby))

Jest równoznaczny ze znaną nam już konstrukcją list składanych :

parzyste=[i*2 for i in liczby]

Jeśli przyszło Ci to na myśl, to bardzo dobrze - oznacza to że rozumiesz obie techniki. Owszem - wynik będzie ten sam, natomiast różne są wewnętrzne metody jego osiągnięcia. W zależności od stosowanego przeliczenia i zawartości listy mogą charakteryzować się różną wydajnością.

Co do samych wyrażeń lambda, na razie nie będziemy ich bardziej zgłębiać bo ten poziom zaznajomienia w kontekście list nam w zupełności wystarczy. Przyjrzymy się wyrażeniom lambda w rozdziale w którym omawiam funkcje.

Funkcja filter

Funkcja filter jak sama nazwa wskazuje, służy do filtrowania zawartości list. Tradycyjnie zaczniemy od przykładu kodu:

liczby=[i for i in range(1,21)]
parzyste=list(filter(lambda x: x%2==0 ,liczby))
print(parzyste)

I równie tradycyjnie sprawdźmy co nam ten kod wydrukował:

[2, 4, 6, 8, 10, 12, 14, 16, 18, 20]

Istotny jest w zasadzie tylko element:

parzyste=list(filter(lambda x: x%2==0 ,liczby))

Ponieważ po ostatnim niespodziewanym porównaniu funkcji "map" do list składanych Twoja podejrzliwość zapewne nieco wzrosła, to tym razem od razu wyłożę karty na stół:

parzyste=[x for x in liczby if x%2==0]

Tym razem w wyrażeniu lambda oczekuje się od nas warunku logicznego stwierdzającego "prawda" lub "fałsz" dla każdego z filtrowanych elementów. Robi to fragment "x%2==0" dla którego jesteśmy w stanie stwierdzić dla każdego elementu czy podane wyrażenie będzie prawdziwe czy nie. Będzie prawdziwe oczywiście tylko dla liczb parzystych, więc tylko takie trafią do listy docelowej.

Szkolenie Python od podstaw, przez analizę danych, do machine learning w JSystems

Ten kurs daje Ci solidne podstawy Pythona. Jeśli chcesz pójść dalej i pod okiem trenera dojść od pierwszej linijki kodu do własnego modelu uczenia maszynowego, sprawdź nasze pięciodniowe szkolenie Python od podstaw, przez analizę danych, do machine learning. Pierwsze trzy dni to Python w praktyce: typy i kolekcje, instrukcje warunkowe i pętle, funkcje, moduły i pakiety, pliki tekstowe, usługi sieciowe oraz praca z bazą PostgreSQL. Czwarty dzień to analiza danych w pandas (wczytywanie CSV, TSV i XLS, filtrowanie, agregacje, statystyki) i wizualizacja w Matplotlib, Seaborn oraz Plotly. Piąty dzień to uczenie maszynowe w scikit-learn: regresja liniowa i logistyczna, drzewa decyzyjne, las losowy, XGBoost, walidacja predykcji, dobór hiperparametrów i przeciwdziałanie przeuczeniu. Szkolenie ma terminy gwarantowane, czyli odbywa się niezależnie od wielkości grupy.

Szkolenie Python od podstaw, przez analizę danych, do machine learning

To szkolenie może być dofinansowane dla Ciebie z KFS lub BUR.

★★★★★Średnia ocena naszych szkoleń w Google: 5/5

Najczęściej zadawane pytania

Do czego służy funkcja map w Pythonie?
Funkcja map stosuje wskazaną funkcję do każdego elementu listy źródłowej. Przyjmuje dwa argumenty: funkcję do wykonania oraz listę źródłową. Aby otrzymać zwykłą listę wyników, wynik map opakowujesz w wywołanie list, ponieważ sama funkcja zwraca obiekt iterowalny.
Do czego służy funkcja filter?
Funkcja filter służy do filtrowania zawartości listy. Przekazujesz jej funkcję zwracającą wartość logiczną prawda lub fałsz dla każdego elementu oraz listę źródłową. Do listy wynikowej trafiają tylko te elementy, dla których warunek jest prawdziwy, na przykład liczby parzyste.
Co oznacza zapis lambda x: x*2?
To wyrażenie lambda, czyli funkcja zapisana w jednej linii. Fragment przed dwukropkiem to nazwa parametru, a fragment po nim określa, jak element ma zostać przetworzony przed zwróceniem. Zapis lambda x: x*2 jest odpowiednikiem zwykłej funkcji, która przyjmuje x i zwraca x pomnożone przez 2.
Czy map i filter można zastąpić listami składanymi?
Tak. Wywołanie map z wyrażeniem lambda ma odpowiednik w postaci listy składanej, podobnie jak filter, który zastępuje lista składana z warunkiem if. Wynik jest ten sam, natomiast wewnętrzne metody jego osiągnięcia są różne i mogą charakteryzować się różną wydajnością w zależności od danych.
Co robi wywołanie list wokół funkcji map lub filter?
Zarówno map, jak i filter zwracają obiekt iterowalny, a nie gotową listę. Opakowanie ich wyniku w wywołanie list powoduje powstanie zwykłej listy z przetworzonymi lub przefiltrowanymi elementami, po której możesz następnie iterować lub którą możesz od razu wyświetlić.

Komentarze (0)

Musisz być zalogowany by móc dodać komentarz. Zaloguj się przez Google

Brak komentarzy...