Pythonでリスト(配列)の中から、「特定の条件に合致するデータだけ」を抜き出したい場合、組み込み関数の filter() を使用するのが便利です。
for文とif文を組み合わせて記述することも可能ですが、filter() を使うことで、意図(フィルタリング処理であること)が明確で、かつ簡潔なコードを記述できます。
目次
解決したい課題
大量のデータの中から「合格ラインを超えた点数」「在庫がある商品」「特定のエラーログ」など、条件(True/False)に基づいて必要な要素だけを抽出した新しいリストを作成します。
実装例:正常なセンサーデータの抽出
ここでは、センサーから取得した数値データのリストから、ノイズと思われる異常値(負の数)を除外し、有効なデータ(0以上の数値)のみを抽出するシナリオを実装します。
ソースコード
# センサーから取得した生データ(負の値はエラー値とする)
sensor_values = [105, -1, 230, 45, -99, 12, 0, 310]
# フィルタリング条件を定義する関数
# 0以上であれば True(抽出対象)、負の数なら False(除外)を返す
def is_valid_data(val):
return val >= 0
# filter関数を実行
# 第一引数:条件判定を行う関数
# 第二引数:対象のリスト
# 戻り値はイテレータのため、list() で変換して確定させる
valid_values = list(filter(is_valid_data, sensor_values))
# 結果の出力
print(f"Original Data: {sensor_values}")
print(f"Filtered Data: {valid_values}")
実行結果
Plaintext
Original Data: [105, -1, 230, 45, -99, 12, 0, 310]
Filtered Data: [105, 230, 45, 12, 0, 310]
解説
filter関数の仕組み
filter(function, iterable) は、iterable(リストなど)の各要素を function に渡し、その戻り値が真(True)である要素だけを保持するイテレータを作成します。
- 第一引数:
TrueまたはFalseを返す関数を指定します。Noneを指定した場合は、要素そのものが真と評価されるもの(0や空文字以外)だけが抽出されます。 - 第二引数: フィルタリング対象のリストやタプルを指定します。
ラムダ式による簡略化
条件判定のロジックが単純な場合、わざわざ def で関数を定義せず、lambda(無名関数)を使用して一行で記述するのが一般的です。
上記のコードを lambda を使って書き換えると以下のようになります。
# 関数定義を省略し、ラムダ式で条件を直接記述
# val >= 0 の要素だけを抽出
valid_values = list(filter(lambda val: val >= 0, sensor_values))
現場のコードでは、このラムダ式を用いた記述が頻繁に使われます。
