Pythonのfilter関数の使い方について紹介します。
filter関数について基本的な使い方や、使用例を解説します。
本記事では、下記の内容を紹介しています。
この記事で分かること
・filter関数の基本的な使い方
・filter関数とlambdaの組合せ
・filter関数を辞書に適用する例
・filter関数とmap関数の比較
スポンサーリンク
filter関数の基本的な使い方
はじめに、filter関数の基本的な内容について紹介します。
filter関数を用いることで、イテラブルオブジェクト(リスト、タプルなど)から、条件に当てはまる要素を抽出できます。
filter関数では、第一引数に関数、第二引数にイテラブルオブジェクトを指定します。
書き方
filter(関数, イテラブルオブジェクト)
第一引数の関数に、イテラブルオブジェクトの要素をひとつずつ適用して評価し、Trueと判定された要素が抽出されます。
また、filter関数はpythonの組み込み関数であるため、importせずに使用することができます。
filter関数をリスト(list)に適用し、条件を満たす要素を抽出
filter関数をリストに適用し、条件を満たす要素を抽出する例を紹介します。
以下の例では、数値のリストから奇数の要素のみを抽出しています。
### filter関数をリストに適用
num_list = list(range(10))
print(num_list)
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
def is_odd(x):
return x % 2 == 1
print(filter(is_odd, num_list))
# <filter object at 0x000002A49FA23550>
print(list(filter(is_odd, num_list)))
# [1, 3, 5, 7, 9]
> def is_odd(x):
> return x % 2 == 1
変数 x を2で割った余りが1の場合はTrueを返す関数、" is_odd " を定義しています。
> print(filter(is_odd, num_list))
> # <filter object at 0x000002A49FA23550>
filter関数の返り値は、" filterオブジェクト "であるため、そのままprintしただけでは要素を確認できません。
> print(list(filter(is_odd, num_list)))
> # [1, 3, 5, 7, 9]
list関数で、" filterオブジェクト "をリストに変換することで要素を確認できます。
もとのリストから、奇数の要素だけが抽出されています。
スポンサーリンク
filter関数とlambdaの組合せ
先ほどの例では、def文で関数 "is_odd" を定義していました。
この例のように、変数が奇数かどうかを判定するような簡単な関数であれば、
いちいちdef文で定義せず、lambda式を用いることで簡潔に記述することができます。
以下、lambda式で、奇数か判定する関数を記述したサンプルコードです。
### filter関数とlambdaの組合せ
num_list = list(range(10))
print(num_list)
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(list(filter(lambda x : x % 2 == 1, num_list)))
# [1, 3, 5, 7, 9]
> print(list(filter(lambda x : x % 2 == 1, num_list)))
> # [1, 3, 5, 7, 9]
" lambda 引数 : 式 " の形で、変数が奇数か判定する関数を記述しています。
num_listから要素を1つずつ取り出し、関数 " x % 2 == 1 " で評価しています。
なお、lambdaについては、以下の記事で紹介しています。
filter関数とlen関数で、特定の文字数の要素を抽出
lambdaを式を用いた、別のサンプルコードを紹介します。
以下のサンプルコードでは、len関数で要素の文字数を求め、指定した文字数の要素のみ抽出しています。
### filter関数とlen関数で、特定の文字数の要素を抽出
fruits_list = ['Apple', 'Banana', 'Orange', 'Grape', 'Mango', 'Lemon', 'Peach', 'Plum']
print(fruits)
# ['Apple', 'Banana', 'Orange', 'Grape', 'Mango', 'Lemon', 'Peach', 'Plum']
print(list(filter(lambda x : len(x) == 5, fruits_list)))
# ['Apple', 'Grape', 'Mango', 'Lemon', 'Peach']
スポンサーリンク
filter関数を辞書(dict)に適用
filter関数を辞書に適用する例を紹介します。
辞書のキーと、値、それぞれにfilter関数を適用する場合のサンプルコードを紹介します。
辞書のキー(key)にfilter関数を適用する例
辞書のキーにfilter関数を適用して、所望の要素を抽出する例を紹介します。
以下、サンプルコードです。
### 辞書のキーにfilter関数を適用
fruits_dict1 = {'Apple':100, 'Banana':200, 'Grape':500, 'Orange':100}
print(fruits_dict1)
# {'Apple': 100, 'Banana': 200, 'Grape': 500, 'Orange': 100}
keys = set(['Banana', 'Orange'])
fruits_dict2 = dict(filter(lambda fruit : fruit[0] in keys, fruits_dict1.items()))
print(fruits_dict2)
# {'Banana': 200, 'Orange': 100}
> keys = set(['Banana', 'Orange'])
抽出したい、キーを記述しています。
set関数でリストを集合型に変換することで、順番を考慮せずキーを指定できるようになります。
> fruits_dict2 = dict(filter(lambda fruit : fruit[0] in keys, fruits_dict1.items()))
分かりづらいですが、dict(filter(関数, イテラブルオブジェクト)) の形になっており、filterで抽出した要素をdict関数で辞書型に変換しています。
"イテラブルオブジェクト"には、fruits_dict1.items()を指定しています。
辞書型にitemsメソッドを適用すると、辞書に含まれるすべてのキーと要素をリスト型で取得できます。
"関数"には、lambda fruit : fruit[0] in keys を指定しています。
lambda式の形で、 fruits_dict1.items() から1つずつ要素を fruit に渡し、
fruit[0] in keys で、抽出したいキーの場合にTrueになるようにしています。
辞書のitemsメソッドの使い方は、下記の記事で詳しく紹介しています。
辞書の値(value)にfilter関数を適用する例
辞書の値にfilter関数を適用して、所望の要素を抽出する例を紹介します。
以下、サンプルコードです。
果物とその価格をペアにした辞書から、価格が200円以上の果物を取得しています。
### 辞書の値にfilter関数を適用
fruits_dict1 = {'Apple':100, 'Banana':200, 'Grape':500, 'Orange':100}
print(fruits_dict1)
# {'Apple': 100, 'Banana': 200, 'Grape': 500, 'Orange': 100}
fruits_dict2 = dict(filter(lambda fruit : fruit[1] >= 200, fruits_dict1.items()))
print(fruits_dict2)
# {'Banana': 200, 'Grape': 500}
前述のサンプルコードに対し、lambda式が異なります。
lambda fruit : fruit[1] >= 200 と、fruit[1]とすることで値が200以上の場合にTrueになるようにしています。
スポンサーリンク
【補足】filter関数とmap関数の比較
filter関数と、map関数はどちらも関数を引数にとることができ、同じ文法で記述できます。
なお、引数や返り値に、関数を指定できる関数のことを、高階関数と呼びます。
map関数を用いると、イテラブルオブジェクト(リストやタプルなど)のすべての要素に対して、
指定した関数を適用できます。
書き方
map(関数, イテラブルオブジェクト)
filter関数とmap関数の動作の違いについては、実際のコードを見た方が理解しやすいと思いますので、
サンプルコードを交えて紹介します。
以下、サンプルコードです。
辞書の値が200かどうかを判定する関数を定義し、map関数とfilter関数の引数に指定しています。
### map関数とfilter関数の動作を比較
fruits_dict1 = {'Apple':100, 'Banana':200, 'Grape':500, 'Orange':100}
print(fruits_dict1)
# {'Apple': 100, 'Banana': 200, 'Grape': 500, 'Orange': 100}
def fruit_price(x) :
return x[1] >= 200
print(list(map(fruit_price, fruits_dict1.items())))
# [False, True, True, False]
print(list(filter(fruit_price, fruits_dict1.items())))
# [('Banana', 200), ('Grape', 500)]
> def fruit_price(x) :
> return x[1] >= 200
引数xには、タプルやリストが渡されます。
x[1]と指定し、辞書の値に対応する要素が200以上か比較しています。
> print(list(map(fruit_price, fruits_dict1.items())))
map関数で、fruits_dict1の要素すべてを、fruit_price関数で処理しています。
map関数は引数の関数をそのまま適用するだけなので、先ほど定義した関数の返り値である、"True" か "False"が、返り値になります。
なお、map関数の返り値はmapオブジェクトで、そのままでは確認できないので、list関数でリストに変換しています。
> print(list(filter(fruit_price, fruits_dict1.items())))
これまで説明してきたとおり、filter関数は、指定した関数がTrueになった要素を抽出します。
したがって、filter関数の返り値は、抽出後の要素になります。
map関数については、下記の記事で詳しく紹介しています。
スポンサーリンク
まとめ
Pythonのfilter関数の基本的な使い方について紹介しました。
要素を抽出する際に、filter関数を用いると可読性が向上するので、是非練習して使ってみてください。
スポンサーリンク