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

min_amount
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))
  1. 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:
  2. category ← tools, totals ← {'tools': 18}, totals[category] ← 18

    pass 1 of 3
    9totals = {}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"]18
    All 3 passes — pass 1 is the card above
    passexpenseexpense[”category”]expense[”amount”]min_amountcategorytotalstotals[category]
    1{'category': 'tools', 'amount': 18}tools18tools{} {'tools': 18}18
    2{'category': 'books', 'amount': 35}books35books{'tools': 18} {'tools': 18, 'books': 35}35
    3{'category': 'tools', 'amount': 12}1215
  3. if expense["amount"] < min_amount:

    10for expense in expenses:11    if expense["amount"]12 < min_amount15:12        continue13    category = expense["category"]
  4. parts ← []

    16parts→ [] = []17for category in sorted(totals):
  5. parts ← ['books=35']

    pass 1 of 2
    16parts = []17for categorybooks in sorted(totals{'tools': 18, 'books': 35}):18    parts→ ['books=35'].append(categorybooks + "=" + str(totals[category]35))
  6. parts ← ['books=35', 'tools=18']

    pass 2 of 2
    16parts = []17for categorytools in sorted(totals{'tools': 18, 'books': 35}):18    parts→ ['books=35', 'tools=18'].append(categorytools + "=" + str(totals[category]18))
  7. print("summary=" + ";".join(parts))

    20print("summary=" + ";".join(parts['books=35', 'tools=18']))
    outputsummary=books=35;tools=18
  1. 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:
  2. for expense in expenses:

    pass 1 of 3
    9totals = {}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        continue
    All 3 passes — pass 1 is the card above
    passexpenseexpense[”amount”]min_amountexpense[”category”]categorytotalstotals[category]
    1{'category': 'tools', 'amount': 18}1830
    2{'category': 'books', 'amount': 35}35booksbooks{} {'books': 35}35
    3{'category': 'tools', 'amount': 12}1230
  3. if expense["amount"] < min_amount:

    pass 1 of 2
    10for expense in expenses:11    if expense["amount"]18 < min_amount30:12        continue13    category = expense["category"]
  4. if expense["amount"] < min_amount:

    pass 2 of 2
    10for expense in expenses:11    if expense["amount"]12 < min_amount30:12        continue13    category = expense["category"]
  5. parts ← []

    16parts→ [] = []17for category in sorted(totals):
  6. parts ← ['books=35']

    16parts = []17for categorybooks in sorted(totals{'books': 35}):18    parts→ ['books=35'].append(categorybooks + "=" + str(totals[category]35))
  7. print("summary=" + ";".join(parts))

    20print("summary=" + ";".join(parts['books=35']))
    outputsummary=books=35