Pythonのfilter関数の使い方|配列から関数の条件にあう要素を抽出のイメージ画像

Pythonのfilter関数の使い方|配列から関数の条件にあう要素を抽出

  • 公開日:2018/11/16
  • 更新日:2018/11/16
  • 投稿者:n bit

Pythonfilter関数使い方について解説。listやtuple、dict等の配列から引数に指定した関数の条件に沿う要素のみを抽出してくれる便利な組み込み関数がfilter関数です。条件に関数を利用できるため少し複雑な条件も設定でき実行処理後イテレータを返してくれます。

  • Python

この記事は約 分で読めます。(文字)

filter関数とは

filter関数はPythonの組み込み関数の1つでリストやタプル、辞書、セット、文字列といった複数の要素を持つ配列オブジェクト内のすべての要素から引数で渡す関数の処理条件にあう要素だけを抽出してイテレータを返す関数です。

Note

イテレータ

『イテレータ』は配列内の要素を1つずつ取り出していく状態を記憶しておくことができるオブジェクト

filter関数の主な用途

  • 配列オブジェクト内のすべての要素から関数の処理条件に適合するもの抽出

例えばリストオブジェクト内の全ての要素の文字列で6文字以上の文字列のみを抽出したい場合は引数で渡すリストの定義も含めて下記のような2行のコードで記述することができます。

words = ['Python', 'CSS', 'HTML', 'JavaScript']


x = filter(lambda word:True if len(word) > 5 else False, words)

ではfilter関数について詳しく学習していきましょう。

filter関数の使い方

filter関数の使い方は『抽出条件を定義した関数』と、『抽出対象となる配列オブジェクト』を引数として渡します。

filter(関数, 配列オブジェクト)

実際にfilter関数を使って様々なオブジェクト内の要素を抽出してみましょう。

list型(リスト)オブジェクト内の文字列要素をfilter関数で抽出

冒頭でサンプルとして見せたコード『リストオブジェクト内の全ての要素の文字列で6文字以上の文字列のみを抽出したい』について分解しながら詳しく解説していきます。

わかりやすいように最初はlambda式を利用せず簡易的な関数を作成してfilter関数の引数として渡してみましょう。簡易関数とリストをfilter関数の引数に渡して返される値をチェックしてみます。

返された値を出力させるためprint関数等に渡してください。

words = ['Python', 'CSS', 'HTML', 'JavaScript']


def text_len(word):
if len(word) > 5:
return True
else:
return False

x = filter(text_len, words)

for text in x:
print(text)

出力結果

Python

JavaScript

リストオブジェクト内の要素で文字列が6文字以上の『Python、JavaScript』が抽出されました。

コードの詳細な解説

1行目はfilter関数で処理対象となる配列オブジェクトを定義しているだけです。

words = ['Python', 'CSS', 'HTML', 'JavaScript']

3〜7行目はfilter関数で配列オブジェクトの抽出条件となる関数を定義しています。引数で受け取った『word』をlen関数で文字列の長さを取得し6文字以上であれば『True』、5文字以下であれば『False』をreturnする簡易な独自関数です。

filter関数は抽出条件となる関数から『True』が返された要素のみを抽出します。text_len関数は6文字以上であれば『True』を返すため抽出される文字列は『Python、JavaScript』です。

9行目でfilter関数に配列の抽出条件となる関数』と『抽出対象となる配列』を引数として渡しています

x = filter(text_lower, words)

filter関数から返される値はリストオブジェクトではなくイテレータオブジェクトなのでfor文でループさせてprint関数で出力しました。

for text in x:

print(text)

filter関数が出力するのはfilterオブジェクト

filter関数で返された値をそのままprint関数で出力するとfilterオブジェクトが出力されます。

print(x)

print(type(x))

出力結果

<filter object at 0x7efeefd0f7f0>

<class 'filter'>

filterオブジェクトはイテレータオブジェクトの中の1つですのでnext関数やfor文のループで中身を確認する必要があります。

イテレータについて忘れてしまった方は下記のページから再度学習しておきましょう。詳しくは下記のページをご覧ください。

filter関数の出力をlist型(リスト)オブジェクトに変換

基本的にはイテレータオブジェクトのままの方が使い勝手が良いケースが多いのでfilter関数からの出力をリストオブジェクトに置き換える事はあまりないですが、内容確認を行いやすくするためなどリスト型に置き換える方法も解説しておきましょう。

filter関数の出力をリスト関数の引数に渡すことでリスト化できます。

list(filter(関数, 配列オブジェクト))

実際にリスト型で出力してみましょう。

words = ['Python', 'CSS', 'HTML', 'JavaScript']


def text_len(word):
if len(word) > 5:
return True
else:
return False

x = list(filter(text_len, words))

print(x)
print(type(x))

出力結果

['Python', 'JavaScript']

<class 'list'>

filter関数内で抽出条件となる関数に適合した要素だけがリストオブジェクトで出力されました。

filter関数とlambda式をあわせて利用する

Pythonの無名関数『lambda』の解説ページでも少し触れましたが引数に関数を扱うfilter関数とlambda式は非常に相性が良いです。

lambdaについて簡単に復習しておきましょう。lambda式の記述方法は下記のようになっています。

  • lambda 引数:返り値(実行処理)

lambdaについては下記のページで詳しく解説しています。

filter関数とlambda式をあわせた記述にコードを変更してみましょう。

words = ['Python', 'CSS', 'HTML', 'JavaScript']


x = filter(lambda word:True if len(word) > 5 else False, words)

print(next(x))
print(next(x))

出力結果

Python

JavaScript

冒頭で紹介したサンプルコードになりましたね。返された値がイテレータオブジェクトであることをわかりやすくするためにnext関数を使って出力しています。

filter関数とlambda式をあわせた使い方は頻繁に出てきます。この形を1つのテンプレートとして覚えておいても良いでしょう。

今日のdot

今回はPythonfilter関数使い方について学習しました。『filter関数』はリスト、タプル、辞書、文字列等の配列オブジェクト内の全ての要素に対して任意の関数の抽出条件に適合するものを抽出しイテレータオブジェクトを返します。

最後のサンプルコードで示したlambda式とfilter関数を組み合わせた利用方法はとても便利ですので覚えておきましょう。

ちなみに、Pythonの発案者であるグイド・ヴァンロッサム氏はlambdaとfilter関数の組み合わせをあまり良しとしておらずジェネレータ式を使うことを推奨しています。

  • filter(Func, S) = (x for x in S if Func(x))