Pythonのmap、reduce、filterを使ったリスト操作の方法

任意の関数をリストの各要素に適用する方法として、map()、reduce()、filter()を説明します。これらの関数は、リストの要素に対して関数を順に適用し、実行結果から新しいリストを生成して返します。なお、リストに関数を適用するとは、リストの要素を引数として関数を実行するということです。

リストの全要素に順番に関数を適用する:map()

map()は、リストの要素を1つずつ取り出し、任意の関数を順番に適用し、その返り値を要素とした新しいリストを返します。

map()の書式は次の通りです。map()は、第一引数に適用する関数を、第二引数に適用先のリスト名を指定します。これは、reduce()、filter()も同様です。

書式

map('適用する関数', '適用先のリスト名')

次のサンプルプログラムでは、予め用意したリストの要素をそれぞれ1加算した結果を要素としたリストの内容を表示しています。

list = [1, 2, 3]              #リストを用意

#リストに適用する関数の定義(引数に1足した結果を返す関数)
def increment(n): 
	return n + 1
	
result = map(increment, list) #リストに関数を順番に適用した結果のリストをresultに代入
print result                  #[2, 3, 4]
print list                    #[1, 2, 3] 元のリストは変更されない

リストの要素数が1になるまで関数を適用する:reduce()

reduce()は、リストの先頭2つの要素を引数にした任意の関数をリストの先頭から順番に適用していくことを繰り返し、最終的に要素数が1のリストを返します。

次のサンプルは1から5の和を求めるプログラムです。

list = [1, 2, 3, 4, 5]

#2つの引数を取り、その和を返す関数の定義
def add(a, b):
	return a + b
	
result = reduce(add, list) #listの先頭2要素についてadd関数を適用することを要素数が1になるまで繰り返す
print result               #15
print list                 #[1,2,3,4,5]

上記のプログラムは((((1+2)+3)+4)+5)を計算していることになります。

最初にリストの先頭の二つの要素(1、2)を引数としてadd関数を実行します。次に、返された値3と元のリストの3番目の要素3を引数としてadd関数を実行します。これをリストの終端まで累積的に繰り返すことで、最終的には要素は一つ(15)になります。

リストの全要素から条件に一致した要素のみを抽出する:filter()

filter()は、リストの全要素について任意の関数を順番に適用し、trueが返された要素のみからなる新しいリストを返します。

次のサンプルプログラムでは、リストの要素から奇数のみを抽出して新しいリストを生成しています。

list = [1, 2, 3]

#引数が奇数の場合にtrueを返す関数の定義
def judge_odd(n):
	if(n%2 != 0):                #奇数の場合trueを返す
		return 1
	else:
		return 0

result = filter(judge_odd, list) #リストに関数を順番に適用し、trueを返した要素のみからなるリストを返す
print result                     #[1, 3]
print list                       #[1,2,3]

イベント