filter()
関数は、Python においてリスト、タプルなど繰り返し要素を返すことのできるオブジェクト(イテラブル)に対して、特定の条件を満たすものだけを抽出するために使われる組み込み関数です。
基本的な構文
Python
filter(function, iterable)
function
:
各要素に適用される関数を指定します。この関数は、要素が条件を満たす場合にTrue
を、満たさない場合にFalse
を返します。しばしばここにラムダ式が使われます。iterable
:
フィルタリングされるイテラブル・オブジェクトです(リスト、タプル、セット、文字列など)。
Python
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# 偶数を判定する関数
def is_even(num):
return num % 2 == 0
# filter() を使って偶数を抽出
even_numbers_iterator = filter(is_even, numbers)
# イテレータをリストに変換して表示
even_numbers_list = list(even_numbers_iterator)
print(even_numbers_list) # 出力: [2, 4, 6, 8, 10]
上の例では、偶数を判定する関数を使って、数値リストから偶数を抽出しました。
Python
fruits = ["apple", "banana", "cherry", "date", "grape"]
# 文字列 'a' を含む果物を抽出
fruits_with_a = list(filter(lambda fruit: 'a' in fruit, fruits))
print(fruits_with_a) # 出力: ['apple', 'banana', 'grape']
この例では、文字列のリストから特定の条件「 a を含むもの」を抽出しました。
ラムダ式と組み合わせる
filter( ) 関数は、簡単な条件を表すラムダ式と組み合わせてよく使われます。
Python
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# ラムダ式を使って偶数を抽出
even_numbers_list = list(filter(lambda num: num % 2 == 0, numbers))
print(even_numbers_list) # 出力: [2, 4, 6, 8, 10]
この例では、先程の例で偶数を判定する関数を使っていた filter関数に偶数判定するラムダ式を代用しています。このように抽出条件がワンライナーなシンプルに書けるなら、ラムダ式を使う方が適しているでしょう。
filter関数とリスト内包表記
filter関数は多くの場合、リスト内包表記で代用することができます。
Python
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# filter() を使った場合
even_numbers_filter = list(filter(lambda num: num % 2 == 0, numbers))
print(even_numbers_filter) # 出力: [2, 4, 6, 8, 10]
# リスト内包表記を使った場合
even_numbers_comprehension = [num for num in numbers if num % 2 == 0]
print(even_numbers_comprehension) # 出力: [2, 4, 6, 8, 10]
一般的に、単純なフィルタリングの場合はリスト内包表記の方が適している、と言えるでしょう。しかし、フィルタリングのロジックが複雑で独立した関数として定義する方が分かりやすい場合や、大量のデータに対してメモリ効率の良いイテレータとして扱いたい場合には filter()
関数を使い、かつ、判定関数を別に定義した方が有用です。
function に None を指定する
条件指定の function に None を指定すると、イテラブルの要素が真偽値として評価されて、Trueとなる要素だけが抽出されます。
Python
my_list = [0, 1, False, True, "", "hello", None, [], [1, 2]]
# None を指定して、真と評価される要素のみを抽出
filtered_list = list(filter(None, my_list))
print(filtered_list) # 出力: [1, True, 'hello', [1, 2]]
因みに、この例のmy_list の要素である [1, 2] は True と評価されます。
下に挙げたオブジェクト以外のオブジェクトは True です。
None
False
- 数値のゼロ (
0
,0.0
,0j
など) - 空のシーケンス (
''
,[]
,()
など) - 空のマッピング (
{}
)
コメント