文法・環境 組み込み関数

【Python】filter関数の使い方【リスト/辞書に適用、lambdaとの組合せ】

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関数については、下記の記事で詳しく紹介しています。

map関数の使い方

スポンサーリンク

まとめ

Pythonのfilter関数の基本的な使い方について紹介しました。

要素を抽出する際に、filter関数を用いると可読性が向上するので、是非練習して使ってみてください。

スポンサーリンク

-文法・環境, 組み込み関数
-,