Pythonのfilter関数の使い方|配列から関数の条件にあう要素を抽出
- 公開日:2018/11/16
- 更新日:2018/11/16
- 投稿者:n bit
Pythonのfilter関数の使い方について解説。listやtuple、dict等の配列から引数に指定した関数の条件に沿う要素のみを抽出してくれる便利な組み込み関数がfilter関数です。条件に関数を利用できるため少し複雑な条件も設定でき実行処理後イテレータを返してくれます。
この記事は約 分で読めます。(文字)
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文のループで中身を確認する必要があります。
イテレータについて忘れてしまった方は下記のページから再度学習しておきましょう。詳しくは下記のページをご覧ください。
Pythonのイテラブル(iterable)とイテレータ(iterator)
Pythonには、イテラブル(iterable)とイテレータ(iterator)と言う重要な概念があり、ある一定以上の段階を超えてコードを記述していくには必要な知識。今回は初心者向けにイテレータの理解に必要『iter関数、next関数』とあわせてわかりやすく解説します。
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については下記のページで詳しく解説しています。
Pythonのlambda(ラムダ式:無名関数)の使い方
Pythonで関数名を持たない無名関数をlambda(ラムダ式)で記述する方法を解説。関数名の指定が必要ないためちょっとした実行処理であれば1行で簡素に記述することができ、関数の引数に簡単な独自関数を渡す場合などに利用します。
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
今回はPythonのfilter関数の使い方について学習しました。『filter関数』はリスト、タプル、辞書、文字列等の配列オブジェクト内の全ての要素に対して任意の関数の抽出条件に適合するものを抽出しイテレータオブジェクトを返します。
最後のサンプルコードで示したlambda式とfilter関数を組み合わせた利用方法はとても便利ですので覚えておきましょう。
ちなみに、Pythonの発案者であるグイド・ヴァンロッサム氏はlambdaとfilter関数の組み合わせをあまり良しとしておらずジェネレータ式を使うことを推奨しています。
- filter(Func, S) = (x for x in S if Func(x))
Pythonで作業メモリを節約できるジェネレータ内包表記の使い方
Pythonで作業メモリを節約しプログラムの実行処理速度を高速化させるジェネレータ内包表記について解説。ジェネレータ関数に似ていますが関数ではなく式のためより簡潔なコードで記述でき、膨大な数の演算でも処理できます。
【フリーランス向けの完全無料Pythonプログラミング講座】
dot blogではこの記事以外にも完全無料でフリーランス向けのPythonプログラミング講座を公開中です。フリーランスとして活躍し稼ぐための強力な武器となりますよ。
Python入門講座【無料のプログラミング学習講座】
最近特に注目度が高くなってきているプログラミング言語Python。転職、フリーランス、独立・起業を検討中、日々の業務が忙しい社会人等は今こそ身に付けておきたいスキルの1つ。初心者向けにやさしいプログラミング学習内容のPython入門講座を無料で公開。