Python — mapuj, filtruj, redukuj

Mar 06 2023
MAP Po pierwsze, zrozummy, dlaczego dokładnie potrzebujemy funkcji mapy iw jaki sposób pomaga nam ona zredukować naszą pracę i zwiększyć wydajność naszego kodu. Załóżmy, że mamy listę do pracy, jak poniżej, ale problem z listą polega na tym, że wszystkie obecne na niej elementy są w formacie łańcuchowym, więc jeśli spróbujemy wykonać jakiekolwiek operacje numeryczne, nie przyniesie to żadnego wyniku.

MAPA

Po pierwsze, zrozummy, dlaczego dokładnie potrzebujemy funkcji mapy i jak pomaga nam to zredukować naszą pracę i zwiększyć wydajność naszego kodu.

Załóżmy, że mamy listę do pracy, jak poniżej, ale problem z listą polega na tym, że wszystkie obecne na niej elementy są w formacie łańcuchowym, więc jeśli spróbujemy wykonać jakiekolwiek operacje numeryczne, nie przyniesie to żadnego wyniku.

l1 = ["3","5","9","12","25"]
x = l1[0]+1
print(x)
----------------------------------------------------------------------
-----
TypeError Traceback (most recent call
last)
Input In [1], in <cell line: 2>()
1 l1 = ["3","5","9","12","25"]
----> 2 x = l1[0]+1
3 print(x)
TypeError: can only concatenate str (not "int") to str

Teraz jednym ze sposobów obejścia tego jest pętla for, spójrzmy

for i in range(len(l1)):
l1[i] = int(l1[i])

x = l1[0]+1
print(x)
4

Weźmiemy inną listę o nazwie l2 i ponownie wykonamy tę samą operację.

l2 = ["3","5","9","12","25"]
l2 = list(map(int,l2))
y = l2[0]+1
print(y)
4

Przyjrzyjmy się teraz również kilku innym przykładom, załóżmy, że chcemy znaleźć wartości kwadratowe całej listy, zobaczmy, jak możemy to zrobić za pomocą funkcji map.

Najpierw napiszmy funkcję 'sq', która zwróci podaną do kwadratu wartość podanej liczby

def sq(a):
  return a*a

l3 = [3,5,7,2,9]
l4 = list(map(sq,l3))
print(l4)
[9, 25, 49, 4, 81]

Teraz spójrzmy na coś bardziej skomplikowanego, co próbujemy teraz osiągnąć, to uzyskać kwadrat i sześcian liczb z 0,8, zapisane na liście. Użyjemy teraz funkcji map, funkcji lambda, a także naszego słowa kluczowego def, aby opisać funkcje kwadratu i sześcianu. Następnie użyjemy pętli for do utworzenia listy.

def sq(a):
  return a*a
def cube(a):
  return a*a*a
func = [sq,cube]
for i in range(8):
  rslt = list(map(lambda x:x(i) ,func))
print(rslt)
[0, 0]
[1, 1]
[4, 8]
[9, 27]
[16, 64]
[25, 125]
[36, 216]
[49, 343]

Jak sama nazwa wskazuje, funkcja filter pomaga nam w filtrowaniu zadanego zbioru iterowalnych, jako argument przyjmuje podaną funkcję na podstawie której będziemy filtrować nasze iterowalne a następnie jako argumenty przyjmuje same iterowalne. Poniżej podano 3 typy filtrów, jeden będzie filtrował liczby większe niż 10 z listy, jeden będzie filtrował liczby mniejsze niż 10, a jeden będzie miał wielokrotne warunkowanie, które stwierdza, że ​​liczba powinna być większa niż 10, ale mniejsza niż 15.

l1 = [34,12,5,8,11,14,19,10,1,50]
def grt_condi(num):
  return num>10
def lsr_condi(num):
  return num<10
def multi_condi(num):
  return num>10 and num<15

l2 = list(filter(grt_condi,l1))
l3 = list(filter(lsr_condi,l1))
l4 = list(filter(multi_condi,l1))

print(l2)
print(l3)
print(l4)
[34, 12, 11, 14, 19, 50]
[5, 8, 1]
[12, 11, 14]

Zrozummy, co robi funkcja reduce i jaki problem rozwiązuje, aby to zrozumieć, najpierw weźmy opis problemu i nasze tradycyjne obejście w rozwiązaniu tego problemu.

Powiedzmy, że istnieje lista i chcemy uzyskać sumę wszystkich liczb całkowitych obecnych na liście

l6 = [2,3,6,5,8,9,10]
x = 0
for i in l6:
  x = x+i
print(x)
43

from functools import reduce
l7 = reduce(lambda x,y:x+y , l6)
print(l7)
43

Aby uzyskać więcej takich treści, śledź mój profil Medium i stronę LinkedIn —https://www.linkedin.com/in/chandan-sengupta/