Python | 1 日 60 分 × 7 日アプリ学習:Python文法を学ぶアプリ 家計簿編

Web APP SQL
スポンサーリンク
スポンサーリンク

家計簿アプリ 4日目のゴール

4日目のテーマは 「登録した支出を“並び替えられる家計簿アプリ”へ進化させ、リスト操作・繰り返し・条件分岐・関数・ファイル操作を実践的に使えるようになること」 です。

ここまでで家計簿アプリは、

  • 支出の登録
  • 一覧表示
  • 項目・日付・金額で検索

という「探せる家計簿アプリ」になりました。

4日目ではここに 並び替え機能(項目順・金額順・日付順) を追加し、 「見やすく整理できる家計簿アプリ」へ育てていきます。

このステップでは、 辞書+リスト+sorted() を使った並び替えが重要テーマになります。

並び替えのために「辞書のリスト」に変換する

検索までは「行のリスト」で処理していましたが、 並び替えは 辞書のリスト のほうが圧倒的に扱いやすいです。

そこでまずは、 kakeibo.txt を辞書のリストに変換する関数を作ります。

def load_expense_entries():
    """
    kakeibo.txt を読み込み、
    1件分の支出を辞書にまとめたリストとして返す
    """
    entries = []

    try:
        with open("kakeibo.txt", "r", encoding="utf-8") as f:
            lines = f.readlines()

        current = {"item": "", "amount": "", "date": ""}

        for line in lines:
            line = line.strip()

            if line == "==== 支出 ====":
                current = {"item": "", "amount": "", "date": ""}
            elif line.startswith("項目:"):
                current["item"] = line.replace("項目:", "").strip()
            elif line.startswith("金額:"):
                current["amount"] = line.replace("金額:", "").strip()
            elif line.startswith("日付:"):
                current["date"] = line.replace("日付:", "").strip()
            elif line == "":
                if current["item"]:
                    entries.append(current)
    except FileNotFoundError:
        print("まだ支出がありません。まずは登録してみましょう。")

    return entries
Python

深掘りポイント

  • current が「1件分の支出」を表す辞書
  • 空行で「1件分の終わり」を判定
  • entries[{ "item": "...", "amount": "...", "date": "..." }, ...] という形になる
  • 並び替え・検索・編集などに非常に扱いやすい構造

辞書のリストをファイルに書き戻す関数

並び替え後に保存したい場合に使います。

def save_expense_entries(entries):
    """
    entries(辞書のリスト)を kakeibo.txt に上書き保存する
    """
    with open("kakeibo.txt", "w", encoding="utf-8") as f:
        for e in entries:
            f.write("==== 支出 ====\n")
            f.write(f"項目: {e['item']}\n")
            f.write(f"金額: {e['amount']}\n")
            f.write(f"日付: {e['date']}\n")
            f.write("\n")
Python

項目順に並び替える機能

def sort_by_item():
    """
    項目順(五十音順)に並び替えて表示する
    """
    entries = load_expense_entries()

    if not entries:
        return

    sorted_entries = sorted(entries, key=lambda e: e["item"])

    print("=== 項目順に並び替えた支出 ===")
    for e in sorted_entries:
        print(f"項目: {e['item']}")
        print(f"金額: {e['amount']}")
        print(f"日付: {e['date']}")
        print("------------------------------")
Python

深掘りポイント

  • sorted() は新しいリストを返す
  • key=lambda e: e["item"] で「項目」を基準に並び替え
  • 並び替えの基本形は sorted(リスト, key=基準)

金額順に並び替える機能

金額は文字列として読み込まれるため、 並び替えの前に 整数に変換する必要があります

def sort_by_amount():
    """
    金額順(安い順)に並び替えて表示する
    """
    entries = load_expense_entries()

    if not entries:
        return

    sorted_entries = sorted(entries, key=lambda e: int(e["amount"]))

    print("=== 金額順(安い順)に並び替えた支出 ===")
    for e in sorted_entries:
        print(f"項目: {e['item']}")
        print(f"金額: {e['amount']}")
        print(f"日付: {e['date']}")
        print("------------------------------")
Python

深掘りポイント

  • 金額は文字列 → int() で数値に変換
  • 数値で並び替えると「安い順」「高い順」が簡単に作れる
  • 高い順にしたい場合は reverse=True を使う

日付順に並び替える機能

日付は "YYYY-MM-DD" 形式なので、 文字列のまま並び替えても正しく並びます。

def sort_by_date():
    """
    日付順(古い順)に並び替えて表示する
    """
    entries = load_expense_entries()

    if not entries:
        return

    sorted_entries = sorted(entries, key=lambda e: e["date"])

    print("=== 日付順(古い順)に並び替えた支出 ===")
    for e in sorted_entries:
        print(f"項目: {e['item']}")
        print(f"金額: {e['amount']}")
        print(f"日付: {e['date']}")
        print("------------------------------")
Python

深掘りポイント

  • "2026-08-08" のような形式は文字列比較で正しく並ぶ
  • 日付順は家計簿でよく使う並び替え

メニューに並び替え機能を追加する

def show_menu():
    print("------------------------------")
    print("Python 家計簿アプリ 4日目 メニュー")
    print("1: 支出を登録する")
    print("2: 支出を一覧表示する")
    print("3: 項目で検索する")
    print("4: 日付で検索する")
    print("5: 金額で検索する")
    print("6: 項目順に並び替える")
    print("7: 金額順に並び替える")
    print("8: 日付順に並び替える")
    print("9: 終了する")
    print("------------------------------")
Python

main に並び替え機能を追加する

def main():
    print("Python 家計簿アプリ 4日目")
    print("支出を登録・表示・検索・並び替えできるようにしていきます。")

    while True:
        show_menu()
        choice = input("番号を入力してください(1〜9): ")

        if choice == "1":
            add_expense()
        elif choice == "2":
            show_all_expenses()
        elif choice == "3":
            search_by_item()
        elif choice == "4":
            search_by_date()
        elif choice == "5":
            search_by_amount()
        elif choice == "6":
            sort_by_item()
        elif choice == "7":
            sort_by_amount()
        elif choice == "8":
            sort_by_date()
        elif choice == "9":
            print("家計簿アプリを終了します。おつかれさまでした。")
            break
        else:
            print("1〜9 のいずれかを入力してください。")
Python

4日目で本当に掴んでほしいこと

● 並び替えは「辞書のリスト+sorted()+key」の応用

  • sorted(entries, key=lambda e: e["item"])
  • sorted(entries, key=lambda e: int(e["amount"]))
  • sorted(entries, key=lambda e: e["date"])

この形を覚えておくと、 どんなデータでも自由に並び替えられます。

● 金額は「文字列 → 数値」に変換して並び替える

家計簿では金額が重要なので、 int() を使った並び替えは必須テクニックです。

● 関数を増やすことでアプリが“部品の集合”として見えてくる

  • sort_by_item()
  • sort_by_amount()
  • sort_by_date()

機能ごとに関数を分けることで、 アプリの構造がクリアになります。

次のステップ(5日目の予告)

5日目では、家計簿アプリをさらに育てて、

  • 支出を編集する
  • 支出を削除する
  • バックアップを作る

という「データ管理アプリとしての完成形」に近づけていきます。

タイトルとURLをコピーしました