自由拡張
100 件を目で追うのはつらい
記録して、集計して、レポートまで出せるようになりました。使っているうちに出てくる「これができたらいいのに」の筆頭が検索です。
「先月コーヒーにいくら使ったか」を知りたいだけなのに、100 件の一覧を眺めるのは無理があります。欲しいのは、品名に コーヒー を含む記録だけを取り出す機能です。
ここで大事なのは、完全一致ではなく 部分一致 にすることです。完全一致だと コーヒー という品名しか拾えず、アイスコーヒー も コーヒー豆 も漏れます。
in は文字列にも効く
in はリストに含まれるかの判定として使ってきました。同じ in が、文字列にも使えます。
Python
print("コーヒー" in "アイスコーヒー")True になります。左が右のどこかに現れれば真、という意味です。向きを逆にすると「品名がキーワードに含まれるか」という別の判定になり、ほとんどの場合ずっと偽になります。キーワード in 品名 の向きを守ります。
あとは記録を 1 件ずつ見て、条件に合うものだけを新しいリストに集めるだけです。第 7 章の絞り込みがそのまま使えます。
見つからなかったときは、空のリストを返します。None は返しません。None を返す設計は、呼び出す側に「結果が None かどうか」の分岐を強制します。同じ「無い」を表すなら、型が変わらない [] のほうが後々楽で、len も for もそのまま使えます。
もう 1 つ、キーワードが空文字のときは全件が返ります。"" in "りんご" が True になるためです。仕様として受け入れるなら、そのままで構いません。
元のリストから消しながら絞り込もうとするのも避けます。記録そのものが壊れます。新しいリストに集めるほうが安全です。
次に何を足すか
検索ができたら、次は自分で決める番です。どれも、ここまでに習った文法だけで作れます。
- 日付を持たせる — 記録に
"date"を足します。期間で絞り込めるようになり、並べ替えの物差しも増えます - 月ごとにまとめる — 日付があれば、月単位の集計や先月との比較ができます
- 棒グラフにする — カテゴリ別の合計を
*の数で表すだけでも形になります。文字列に整数を掛けると、その回数だけ繰り返した文字列になります
新しい知識を足す前に、持っている道具で作れる範囲を広げるほうが力が付きます。
やってみよう
関数 search_records(records, keyword) を実装してください。records は支出の辞書のリスト、keyword は探したい文字列です。
品名に keyword を含む記録だけを、元の順番のまま新しいリストにして返します。1 件も見つからないときと records が空のときは、どちらも空のリストを返してください。返すのは辞書そのもので、品名だけを取り出したりはしません。
返るのが記録そのものなので、結果をそのまま monthly_report に渡せます。「コーヒーだけの月間レポート」が、新しいコードなしで出せることになります。
要件
- 関数名は search_records で、引数は records と keyword の2つ
- 品名に keyword を含む記録だけを集める。完全一致ではなく部分一致にする
- 返すのは記録の辞書そのもの。品名だけを取り出さない
- 元の並び順を変えない
- 1件も見つからないときと records が空のときは、空のリストを返す