Case Studies
Expense Summary
A small report can filter records and then group totals by category.
report pipeline
Case-study code often combines earlier ideas: filtering, grouping, and sorted output.
Expense Summary
expense_summary.py
Replay: real traced execution (multi-file project)
expenses = [
{"category": "tools", "amount": 18},
{"category": "books", "amount": 35},
{"category": "tools", "amount": 12},
]
min_amount = 15
totals = {}
for expense in expenses:
if expense["amount"] < min_amount:
continue
category = expense["category"]
totals[category] = totals.get(category, 0) + expense["amount"]
parts = []
for category in sorted(totals):
parts.append(category + "=" + str(totals[category]))
print("summary=" + ";".join(parts))
expenses = [
{"category": "tools", "amount": 18},
{"category": "books", "amount": 35},
{"category": "tools", "amount": 12},
]
min_amount = 30
totals = {}
for expense in expenses:
if expense["amount"] < min_amount:
continue
category = expense["category"]
totals[category] = totals.get(category, 0) + expense["amount"]
parts = []
for category in sorted(totals):
parts.append(category + "=" + str(totals[category]))
print("summary=" + ";".join(parts))
expenses ← [{'category': 'tools', 'amount': 18}, {'category': 'books', 'amount': 35}, {'category': 'tools', 'amount': 12}]
1expenses→ [{'category': 'tools', 'amount': 18}, {'category': 'books', 'amount': 35}, {'category': 'tools', 'amount': 12}] = [2 {"category": "tools", "amount": 18},3 {"category": "books", "amount": 35},4 {"category": "tools", "amount": 12},5]67min_amount→ 15 = 15 #@min_amount=3089totals→ {} = {}10for expense in expenses:category ← tools, totals ← {'tools': 18}, totals[category] ← 18
pass 1 of 39totals = {}10for expense{'category': 'tools', 'amount': 18} in expenses[{'category': 'tools', 'amount': 18}, {'category': 'books', 'amount': 35}, {'category': 'tools', 'amount': 12}]:11 if expense["amount"] < min_amount:12 continue13 category→ tools = expense["category"]tools14 totals[category]→ 18 = totals→ {'tools': 18}.get(categorytools, 0) + expense["amount"]18All 3 passes — pass 1 is the card above pass expenseexpense[”category”]expense[”amount”]min_amountcategorytotalstotals[category]1 {'category': 'tools', 'amount': 18} tools 18 — tools {} → {'tools': 18} 18 2 {'category': 'books', 'amount': 35} books 35 — books {'tools': 18} → {'tools': 18, 'books': 35} 35 3 {'category': 'tools', 'amount': 12} — 12 15 — — — if expense["amount"] < min_amount:
10for expense in expenses:11 if expense["amount"]12 < min_amount15:12 continue13 category = expense["category"]parts ← []
16parts→ [] = []17for category in sorted(totals):parts ← ['books=35']
pass 1 of 216parts = []17for categorybooks in sorted(totals{'tools': 18, 'books': 35}):18 parts→ ['books=35'].append(categorybooks + "=" + str(totals[category]35))parts ← ['books=35', 'tools=18']
pass 2 of 216parts = []17for categorytools in sorted(totals{'tools': 18, 'books': 35}):18 parts→ ['books=35', 'tools=18'].append(categorytools + "=" + str(totals[category]18))print("summary=" + ";".join(parts))
20print("summary=" + ";".join(parts['books=35', 'tools=18']))outputsummary=books=35;tools=18
expenses ← [{'category': 'tools', 'amount': 18}, {'category': 'books', 'amount': 35}, {'category': 'tools', 'amount': 12}]
1expenses→ [{'category': 'tools', 'amount': 18}, {'category': 'books', 'amount': 35}, {'category': 'tools', 'amount': 12}] = [2 {"category": "tools", "amount": 18},3 {"category": "books", "amount": 35},4 {"category": "tools", "amount": 12},5]67min_amount→ 30 = 3089totals→ {} = {}10for expense in expenses:for expense in expenses:
pass 1 of 39totals = {}10for expense{'category': 'tools', 'amount': 18} in expenses[{'category': 'tools', 'amount': 18}, {'category': 'books', 'amount': 35}, {'category': 'tools', 'amount': 12}]:11 if expense["amount"] < min_amount:12 continueAll 3 passes — pass 1 is the card above pass expenseexpense[”amount”]min_amountexpense[”category”]categorytotalstotals[category]1 {'category': 'tools', 'amount': 18} 18 30 — — — — 2 {'category': 'books', 'amount': 35} 35 — books books {} → {'books': 35} 35 3 {'category': 'tools', 'amount': 12} 12 30 — — — — if expense["amount"] < min_amount:
pass 1 of 210for expense in expenses:11 if expense["amount"]18 < min_amount30:12 continue13 category = expense["category"]if expense["amount"] < min_amount:
pass 2 of 210for expense in expenses:11 if expense["amount"]12 < min_amount30:12 continue13 category = expense["category"]parts ← []
16parts→ [] = []17for category in sorted(totals):parts ← ['books=35']
16parts = []17for categorybooks in sorted(totals{'books': 35}):18 parts→ ['books=35'].append(categorybooks + "=" + str(totals[category]35))print("summary=" + ";".join(parts))
20print("summary=" + ";".join(parts['books=35']))outputsummary=books=35