家計簿アプリ 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("------------------------------")
Pythonmain に並び替え機能を追加する
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 のいずれかを入力してください。")
Python4日目で本当に掴んでほしいこと
● 並び替えは「辞書のリスト+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日目では、家計簿アプリをさらに育てて、
- 支出を編集する
- 支出を削除する
- バックアップを作る
という「データ管理アプリとしての完成形」に近づけていきます。


