
One Point of Python “map, filter, reduce 関数”
Python の初心者向けに、知っておけば得するちょっとした豆知識を提供したい。今回は、“map, filter, reduce 関数”について取り上げる。
map関数は第1引数の関数を第2引数のシーケンスの要素ごとに適用する。
以下の例にしめすようにfor文を使ったループを省略できる。第1引数の関数には当然lambda式が使える。
>>> ll = [0,1,2,3,4,5]
>>> mm = []
>>> for x in ll:
... mm.append(x*2)
...
>>> mm
[0, 2, 4, 6, 8, 10]
>>> nn = map(lambda x: x*2, ll)
>>> nn
[0, 2, 4, 6, 8, 10]
こんな使い方もできるので便利である。具体的には 1**2, 2**3, 3**4である。
>>> map(pow, [1,2,3],[2,3,4])
[1, 8, 81]
filter関数は第1引数の条件にあうものだけを抽出する。
>>> ll = []
>>> for x in range(10):
... if x%2==0:
... ll.append(x)
...
>>> ll
[0, 2, 4, 6, 8]
>>> filter(lambda x: x%2==0, range(10))
[0, 2, 4, 6, 8]
reduce関数は第2引数のシーケンスの1番と2版の要素から第1引数の関数を実行しその結果と3番の要素に第1引数の関数を実行する...を最後の要素まで続ける。ちょっと分かりづらいが、総和を計算する場合は下記に示すようなコードで実行できる。reduce関数を使えば1行で記述できる。
>>> s = 0
>>> for x in [1,2,3,4]:
... s += x
...
>>> s
10
>>> reduce(lambda x,y:x+y, [1,2,3,4])
10
>>> import operator; reduce(operator.add, [1,2,3,4])
10
ここで紹介した関数は無くてもPythonの制御文で容易に代替えできる。
ただし関数プログラミングの視点からは積極的に利用したい。メリットとしてはコードが短くなり意味がわかりやすくなる。
#ビジネス #プログラミング #Python #線形代数 #数学 #AI #IT