Python の filter() 関数は、反復処理可能な要素(シーケンス)の各要素をテストする述語の助けによってフィルタリングするために使用されます。
述語とは、常に True または False を返す関数のことです。
filter()` は、適切な条件が満たされた場合にのみすべての要素を返すので、汎用的な関数を使うことはできません。
つまり、フィルタリング関数は常にブール値を返さなければならないので、フィルタリング関数は述語であると言えます。
filter() の基本的な書式
これはPythonのイテラブルを操作する関数なので、イテラブルはパラメータの1つです。
そして、各要素に対して述語をテストするので、関数もまた必要なパラメータの1つです。
そして、シーケンスから要素をフィルタリングするので、フィルタリング関数を満たす要素のみからなるイテラブルを返す必要があります。
しかし、今回はオブジェクトを扱うので、Pythonはフィルタオブジェクトをイテラブルとして返します。
これは、 list() や dict() といったメソッドを使って他の型に変換するときに便利でしょう。
シンプルでしょう?では、これを応用して filter() を使ったプログラムを作ってみましょう。
書式は以下の通りです。
ここでは、ある数字が奇数か偶数かをテストする関数でリストをフィルタリングする非常に簡単な例を示します。
a = [1, 2, 3, 4, 5]
# We filter using a lambda function predicate.# This predicate returns true# only if the number is even.filter_obj_even = filter(lambda x: x%2 == 0, a)
print(type(filter_obj_even))
# Convert to a list using list()print('Even numbers:', list(filter_obj_even))
# We can also use define the predicate using def()def odd(num):
return (num % 2) != 0
filter_obj_odd = filter(odd, a)
print('Odd numbers:', list(filter_obj_odd))
|
結果は以下の通りです。
<class 'filter'>
Even numbers: [2, 4]Odd numbers: [1, 3, 5] |
filterオブジェクトは反復可能なので、それを反復することによって個々の要素を得ることができることに注意してください。
for item in filter_obj_odd:
print(item)
|
結果は以下の通りです。
135 |
filter() と None
filter()では、述語としてNoneを使用することもできます。
None はオブジェクトのブール値が True ならば True を返し、そうでなければ False を返します。
つまり、 0, None, '', [] などのオブジェクトは、空の要素オブジェクトであるため、 None 述語によってすべてフィルタリングされることになります。
a = [0, 1, 'Hello', '', [], [1,2,3], 0.1, 0.0]
print(list(filter(None, a)))
|
結果は以下の通りです。
[1, 'Hello', [1, 2, 3], 0.1]
|
まとめ
Python が提供する、反復処理に述語を適用するための filter() 関数について学びました。
filter` は簡潔で読みやすいので、最近の Python コードベースでは開発者の間で非常に人気のある関数です。
参考文献
- Python フィルタに関する JournalDev の記事
- Python.org API ドキュメント