filter

このレッスンでできるようになること。filter を使って、条件に合う支出だけを取り出せるようになります。

filter(関数, リスト) は、リストの要素を1つずつ関数に渡し、戻り値が真になった要素だけを順に取り出せるものを返します。map が「全部を変換する」道具だったのに対し、filter は「一部だけ残す」道具です。要素そのものは変わりません。

amounts = [220, 640, 1280] print(list(filter(lambda a: a >= 500, amounts))) # [640, 1280]

filter も map と同じで、返ってくるのは filter オブジェクトです。そのまま返すと呼び出し側で扱いにくく、一度使い切ると空になってしまいます。結果を使うときは必ず list() に通してください。

渡す関数は真偽値を返す形にします。このような判定用の関数を述語と呼びます。lambda で書いてもよいですし、条件に名前を付けたいときは def で書いて渡しても構いません。

def is_food(expense): return expense["category"] == "食費" expenses = [ {"name": "牛乳", "amount": 220, "category": "食費"}, {"name": "電車代", "amount": 640, "category": "交通費"}, ] print(list(filter(is_food, expenses)))

第3章のリスト内包表記でも同じことは書けます。どちらを選んでも構いませんが、既にある関数をそのまま条件として使い回したいときは filter のほうが素直です。条件に名前が付いていると、後から読む人が何を残したかったのかを一目で理解できます。

要件

  1. filter を使って絞り込む
  2. amount が下限金額以上のものを残す(下限ちょうども残す)
  3. filter オブジェクトではなく list を返す

入出力例

pick_expensive([{"amount":220,"category":"食費","name":"牛乳"},{"amount":1280,"category":"食費","name":"コーヒー豆"},{"amount":640,"category":"交通費","name":"電車代"},{"amount":2035,"category":"教養費","name":"書籍"}], 1000)[{"amount":1280,"category":"食費","name":"コーヒー豆"},{"amount":2035,"category":"教養費","name":"書籍"}] pick_expensive([{"amount":220,"category":"食費","name":"牛乳"},{"amount":1280,"category":"食費","name":"コーヒー豆"},{"amount":640,"category":"交通費","name":"電車代"}], 640)[{"amount":1280,"category":"食費","name":"コーヒー豆"},{"amount":640,"category":"交通費","name":"電車代"}]

ヒント

生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア
編集 LuaGate編集部
main.py
学習モード

メモ

filter

⌘S で保存