コース一覧
    Pythonファイル・エラー・制作
    自由拡張

    Pythonファイル・エラー・制作

    ファイル操作と例外処理を学び、入出力を含む小さなPython制作を安全に進められるようにします。

    1
    ファイルとエラー処理
    01. ファイルを読み込む15分
    02. ファイルに書き込む15分
    03. withで安全に扱う15分
    04. CSV形式で保存15分
    05. try-exceptで備える15分
    06. 例外の種類15分
    07. つくる:保存機能15分
    08. 第8章クイズ10分
    2
    総合制作
    01. 全機能を統合しよう15分
    02. 月間レポート機能15分
    03. 自由拡張15分
    04. 完成と次のステップ10分

    自由拡張

    100 件を目で追うのはつらい

    記録して、集計して、レポートまで出せるようになりました。使っているうちに出てくる「これができたらいいのに」の筆頭が検索です。

    「先月コーヒーにいくら使ったか」を知りたいだけなのに、100 件の一覧を眺めるのは無理があります。欲しいのは、品名に コーヒー を含む記録だけを取り出す機能です。

    ここで大事なのは、完全一致ではなく 部分一致 にすることです。完全一致だと コーヒー という品名しか拾えず、アイスコーヒー も コーヒー豆 も漏れます。

    in は文字列にも効く

    in はリストに含まれるかの判定として使ってきました。同じ in が、文字列にも使えます。

    Python

    print("コーヒー" in "アイスコーヒー")

    True になります。左が右のどこかに現れれば真、という意味です。向きを逆にすると「品名がキーワードに含まれるか」という別の判定になり、ほとんどの場合ずっと偽になります。キーワード in 品名 の向きを守ります。

    あとは記録を 1 件ずつ見て、条件に合うものだけを新しいリストに集めるだけです。第 7 章の絞り込みがそのまま使えます。

    見つからなかったときは、空のリストを返します。None は返しません。None を返す設計は、呼び出す側に「結果が None かどうか」の分岐を強制します。同じ「無い」を表すなら、型が変わらない [] のほうが後々楽で、len も for もそのまま使えます。

    もう 1 つ、キーワードが空文字のときは全件が返ります。"" in "りんご" が True になるためです。仕様として受け入れるなら、そのままで構いません。

    元のリストから消しながら絞り込もうとするのも避けます。記録そのものが壊れます。新しいリストに集めるほうが安全です。

    次に何を足すか

    検索ができたら、次は自分で決める番です。どれも、ここまでに習った文法だけで作れます。

    1. 日付を持たせる — 記録に "date" を足します。期間で絞り込めるようになり、並べ替えの物差しも増えます
    2. 月ごとにまとめる — 日付があれば、月単位の集計や先月との比較ができます
    3. 棒グラフにする — カテゴリ別の合計を * の数で表すだけでも形になります。文字列に整数を掛けると、その回数だけ繰り返した文字列になります

    新しい知識を足す前に、持っている道具で作れる範囲を広げるほうが力が付きます。

    やってみよう

    関数 search_records(records, keyword) を実装してください。records は支出の辞書のリスト、keyword は探したい文字列です。

    品名に keyword を含む記録だけを、元の順番のまま新しいリストにして返します。1 件も見つからないときと records が空のときは、どちらも空のリストを返してください。返すのは辞書そのもので、品名だけを取り出したりはしません。

    返るのが記録そのものなので、結果をそのまま monthly_report に渡せます。「コーヒーだけの月間レポート」が、新しいコードなしで出せることになります。

    要件

    1. 関数名は search_records で、引数は records と keyword の2つ
    2. 品名に keyword を含む記録だけを集める。完全一致ではなく部分一致にする
    3. 返すのは記録の辞書そのもの。品名だけを取り出さない
    4. 元の並び順を変えない
    5. 1件も見つからないときと records が空のときは、空のリストを返す

    ヒント

    文字列にも in が使えます。keyword in record["name"] で部分一致を調べられます

    in の向きに注意してください。キーワードが左、品名が右です

    空のリストを用意して append で集めると、元の並び順がそのまま残ります

    リスト内包表記なら [record for record in records if keyword in record["name"]] の1行で書けます

    見つからないときに None を返すと、呼び出し側で for が回せなくなります

    生田 陸人
    監修生田 陸人
    ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
    編集 ゆめさく編集部·公開 2026/08/05·更新 2026/08/26

    関連レッスン

    • 完成と次のステップ

      手元で動く kakeibo.py の全文を読み、動かし方を確認したうえでコース全体を5問で総復習する

    • 月間レポート機能

      合計・カテゴリ別・最高額・予算の残りをまとめて辞書で返す monthly_report を作る

    • 全機能を統合しよう

      各章で作った部品を1本にまとめ、コマンド列を順に処理する run_kakeibo を作る

    このレッスンに出てくる用語

    意味があいまいなまま進んだ語は、ここから読み直せます。

    • リスト順序付きで複数の値を扱うデータ構造
    • 設計何をどう作るかを決める前工程
    • グラフノード(頂点)とエッジ(辺)で構成されるデータ構造。
    • 関数処理に名前を付けて再利用できる単位
    • 引数位置引数=順番で渡す。
    main.py
    エディタを読み込んでいます

    メモ

    自由拡張

    ⌘S で保存