Python初心者の方から多く寄せられる「filter()関数の使い方がわからない」という悩みについて、具体例を交えながら詳しく解説します。
`filter()`は、イテラブル(リストなど)から条件に合う要素だけを抽出できる便利な組み込み関数です。基本構文は以下の通りです:
filter(関数, イテラブル)基本的な使い方
最もシンプルな例として、数値のリストから偶数だけを抽出してみましょう:
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# 偶数を判定する関数
def is_even(x):
return x % 2 == 0
# filter()で偶数を抽出
even_numbers = list(filter(is_even, numbers))
print(even_numbers) # 出力: [2, 4, 6, 8, 10]lambdaを使った簡潔な記述
関数を別途定義せず、lambda式を使うとより簡潔に書けます:
numbers = [1, 2, 3, 4, 5]
even_numbers = list(filter(lambda x: x % 2 == 0, numbers))
print(even_numbers) # 出力: [2, 4]文字列のフィルタリング
数値だけでなく、文字列の処理にも使えます:
words = ['apple', 'banana', 'cherry', 'date']
long_words = list(filter(lambda x: len(x) > 5, words))
print(long_words) # 出力: ['banana']Noneの除去
リストからNoneを除去する際にも便利です:
mixed_list = [1, None, 'hello', None, 2]
valid_items = list(filter(None, mixed_list))
print(valid_items) # 出力: [1, 'hello', 2]注意点とベストプラクティス
1. `filter()`の戻り値はフィルターオブジェクトなので、通常は`list()`でリストに変換して使用します。
2. Python 3では、`filter()`の結果はイテレータとなるため、一度しか使用できません:
filtered = filter(lambda x: x > 0, [-1, 0, 1, 2])
print(list(filtered)) # 出力: [1, 2]
print(list(filtered)) # 出力: [] (2回目は空)3. リスト内包表記との比較:
# filter()を使用
even_numbers = list(filter(lambda x: x % 2 == 0, range(10)))
# リスト内包表記
even_numbers = [x for x in range(10) if x % 2 == 0]どちらも同じ結果になりますが、可読性を重視する場合はリスト内包表記が推奨されることもあります。
まとめ
`filter()`関数は:
- イテラブルから条件に合う要素を抽出できる
- lambda式との組み合わせで簡潔に書ける
- Noneの除去に便利
- イテレータを返すため、必要に応じてリストに変換する
適切な使用シーンを見極めることで、よりPythonらしい効率的なコードが書けるようになります。