anyとall
このレッスンでできるようになること。any と all を使って、「1件でもあるか」「全件そうか」をフラグ変数なしで判定できるようになります。
any(判定の並び) は1つでも真があれば True、all(判定の並び) は全部が真なら True を返します。中身は真偽値の並びなので、第3章のジェネレータ式と組み合わせるのが定番です。
amounts = [220, 640, 1280]
print(any(a >= 1000 for a in amounts)) # True
print(all(a >= 1000 for a in amounts)) # Falseこれを for 文で書くと、フラグ変数を用意して途中で break する形になります。any と all を使えば意図がそのまま1行で表せますし、真偽が確定した時点で走査を打ち切ってくれるので無駄もありません。
空のリストを渡したときの答えは覚えておく価値があります。any([]) は False、all([]) は True です。all が True になるのは「反例が1つも無い」からで、支出が0件のときに「全件が予算内」と判定されるのはそのためです。空のときにどう振る舞ってほしいかは、必ず自分で決めて書き分けてください。
家計簿では次のように使います。
expenses = [
{"name": "牛乳", "amount": 220},
{"name": "書籍", "amount": 2035},
]
over = any(e["amount"] > 1000 for e in expenses) # 予算超過が1件でもあるか
safe = all(e["amount"] <= 1000 for e in expenses) # 全件が予算内か金額は int で比べます。float にすると 1000.0000000000001 のような値で判定がひっくり返ることがあるためです。
要件
- over_exists は any で判定する
- all_within は all で判定する
- 予算ちょうどの支出は超過にしない
- 2つのキーを持つ辞書を返す
入出力例
check_budget([{"amount":220,"name":"牛乳"},{"amount":2035,"name":"書籍"}], 1000) → {"all_within":false,"over_exists":true}
check_budget([{"amount":220,"name":"牛乳"},{"amount":640,"name":"電車代"},{"amount":1000,"name":"昼食"}], 1000) → {"all_within":true,"over_exists":false}ヒント
編集 LuaGate編集部