filter関数 リストから条件を指定して抽出する

filter関数とは

リストの中から指定条件に合致した要素だけ抽出したい場合がありますが、そんな場合はfirter関数を使用します。引数に抽出条件となる関数を指定しますが、これはmap関数とよく似ていますね。戻り値はイテラブルのfilter型と呼ばれるオブジェクトとなります。指定する関数は引数に対して何らかの判定を行う、つまり論理型を返すものを使用します。

filter関数
filter(関数オブジェクト, イテラブルオブジェクト)

では、さっそくサンプルです。整数のリストがに対し、奇数のものだけを抽出する場合を考えてみます。filter関数を使用した場合、以下のように書くことができます。

def is_odd(n):
    """ 奇数判定関数 """
    return (n%2) == 1

data1 = [1, 2, 4, 5, 6, 10, 11] 
data2 = filter(is_odd, data1)
print(list(data2)) # 1, 5, 11

data1は整数のリストです。is_oddは、引数で指定された数値に対し、奇数の場合Trueを返す関数です。filterでその判定用関数と整数リストを指定して結果を取得しています。戻り値のfilterオブジェクトの内容を確認するため7行目でlist関数を一旦はさんでいます。

2021/10 「filterオブジェクトはシーケンス」という記述がありましたが誤りであるため訂正しました。

補足 lambda式と組み合わせる

やはりfilter関数もmap関数と同様、lambda式と併用することが多いです。上記関数をlambda式で書きなおしてみましょう。

data1 = [1, 2, 4, 5, 6, 10, 11] 
data2 = filter(lambda x: x%2 == 1, data1)
print(list(data2)) # 1, 5, 11

関数定義がなくなった分、スッキリ書くことができましたね。