Python — マップ、フィルター、リデュース

Mar 06 2023
MAP まず、map 関数が正確に必要な理由と、map 関数が作業を軽減し、コードをより効率的にするのにどのように役立つかを理解しましょう。以下のような作業対象のリストがあるとします。ただし、リストの問題は、そのリストに含まれるすべての要素が文字列形式であるため、数値演算を実行しようとしても結果が得られないことです。

地図

まず、マップ関数が正確に必要な理由と、マップ関数が作業を軽減し、コードをより効率的にするのにどのように役立つかを理解しましょう。

以下のような作業対象のリストがあるとします。ただし、リストの問題は、そのリストに含まれるすべての要素が文字列形式であるため、数値演算を実行しようとしても結果が得られないことです。

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

これを回避する 1 つの方法は for ループです。見てみましょう

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

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

l2 という別のリストを使用して、同じ操作を再度実行します。

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

次に、他の例もいくつか見てみましょう。リスト全体の 2 乗値を調べたいとします。map 関数を使用してそれを行う方法を見てみましょう。

まず、指定された数値の二乗値を返す関数 'sq' を作成しましょう

def sq(a):
  return a*a

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

ここで、より複雑なことを見てみましょう。現在達成しようとしているのは、0、8 から数値の 2 乗と 3 乗を取得し、リストに保存することです。ここでは、map 関数、lambda 関数、さらに def キーワードを使用して、square 関数と cube 関数を説明します。次に、for ループを使用してリストを作成します。

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]

名前が示すように、 filter 関数は、指定された iterable のセットをフィルタリングするのに役立ちます。引数として、 iterable をフィルタリングする際に基づいて指定された関数を受け取り、その後、 iterable 自体を引数として受け取ります。以下に 3 種類のフィルターが示されています。1 つはリストから 10 より大きい数値をフィルターするもの、1 つは 10 未満の数値をフィルターするもの、もう 1 つは数値が 10 より大きく 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]

Reduce 関数が何を行うのか、そしてそれがどのような問題を解決するのかを理解しましょう。これを理解するために、まず問題ステートメントとそれを解決するための従来のウォークアラウンドを見てみましょう。

リストがあり、リストに含まれるすべての整数の合計を取得したいとします。

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

このようなコンテンツをもっと知りたい場合は、私の Medium プロフィールと LinkedIn ページをフォローしてください —https://www.linkedin.com/in/chandan-sengupta/