Pythonで高階関数を使う(map, filter, reduceなど)
この記事では、Pythonの高階関数であるmap、filter、reduceの使い方を説明します。これらはリストなどのイテラブルオブジェクトを処理する際に非常に便利です。具体的な例を通して、それぞれの関数の動作と利点を理解します。
目次
map関数:各要素への処理適用
map関数は、イテラブルオブジェクトの各要素に指定された関数を適用し、新しいイテラブルオブジェクトを返します。
numbers = [1, 2, 3, 4, 5]
squared_numbers = list(map(lambda x: x**2, numbers))
print(squared_numbers) # 出力: [1, 4, 9, 16, 25]
lambda式を用いて、簡潔に関数を定義できます。map関数の戻り値はmapオブジェクトなので、list()などでリストに変換する必要があります。
numbers = [1, 2, 3, 4, 5]
def square(x):
return x**2
squared_numbers = list(map(square, numbers))
print(squared_numbers) # 出力: [1, 4, 9, 16, 25]
複数のイテラブルオブジェクトを同時に処理することも可能です。
filter関数:条件に一致する要素の抽出
filter関数は、イテラブルオブジェクトから、指定された条件を満たす要素のみを抽出します。
numbers = [1, 2, 3, 4, 5]
even_numbers = list(filter(lambda x: x % 2 == 0, numbers))
print(even_numbers) # 出力: [2, 4]
lambda式で条件を記述します。filter関数の戻り値もfilterオブジェクトなので、リストに変換する必要があります。
reduce関数:要素の累積処理
reduce関数は、イテラブルオブジェクトの要素を累積的に処理します。 functoolsモジュールからインポートする必要があります。
from functools import reduce
numbers = [1, 2, 3, 4, 5]
sum_of_numbers = reduce(lambda x, y: x + y, numbers)
print(sum_of_numbers) # 出力: 15
二つの引数を取り、累積結果を返す関数をlambda式で定義します。 初期値を指定することも可能です。
from functools import reduce
numbers = [1, 2, 3, 4, 5]
product_of_numbers = reduce(lambda x, y: x * y, numbers, 1) #初期値1
print(product_of_numbers) #出力 120
実践例:データ処理の高速化
高階関数は、リスト内包表記と比較して、可読性を高め、コードを簡潔にするのに役立ちます。特に、複雑な処理を行う場合は、その効果が顕著です。
names = ['Alice', 'Bob', 'Charlie', 'David']
#リスト内包表記
lengths = [len(name) for name in names]
print(lengths) #出力 [5, 3, 7, 5]
#map関数
lengths = list(map(len, names))
print(lengths) #出力 [5, 3, 7, 5]
上記のように、map関数はリスト内包表記と同様の結果を得ることができ、可読性も高いです。
まとめ
map、filter、reduce関数は、Pythonでイテラブルオブジェクトを効率的に処理するための強力なツールです。lambda式と組み合わせることで、コードを簡潔に記述できます。それぞれの関数の特性を理解し、適切に使い分けることで、データ処理の生産性を向上させることができます。