如何实现按年月筛选收支项并汇总分类金额的overview函数
如何实现按年月筛选收支项并汇总分类金额的overview函数
嘿,我看了你写的代码,发现几个关键小问题导致overview函数没法正常工作,我来帮你一步步修正,让它实现你想要的功能~
先说说现有代码的问题
- 存储收支项的方式错误:你在
add_item里把listof_items定义成了集合{day,month,year,amount,category},集合不仅会自动去重,还没法保留各个字段的对应关系;而且这是个局部变量,每次调用add_item都会覆盖之前的内容,根本存不住所有记录。 - 没有正确访问全局存储变量:就算你把
listof_items定义在全局,在函数里直接赋值的话会被当成局部变量,需要用global声明才能修改全局变量。
修正后的完整代码
# 用列表存储所有收支记录,每条记录是一个字典,方便后续筛选和汇总 transactions = [] def add_item(day, month, year, amount, category): # 声明使用全局的transactions列表 global transactions # 把当前收支项以字典形式加入列表,保留所有字段信息 transactions.append({ "day": day, "month": month, "year": year, "amount": amount, "category": category }) def overview(target_month, target_year): # 初始化一个空字典,用来存每个分类的总金额 category_totals = {} # 遍历所有收支记录 for item in transactions: # 筛选出年月匹配的记录 if item["month"] == target_month and item["year"] == target_year: cat = item["category"] amt = item["amount"] # 如果分类已经在汇总字典里,就累加金额;否则初始化后再加 if cat in category_totals: category_totals[cat] += amt else: category_totals[cat] = amt return category_totals # 测试添加收支项 add_item(15,10,2022,150,"food") add_item(16,11,2022,250,"food") add_item(17,11,2022,300,"housing") add_item(18,11,2022,500,"food") add_item(16,11,2022,150,"housing") # 测试overview函数 print(overview(11,2022))
代码运行结果
运行后会输出:
{'food': 750, 'housing': 450}
(注:你给出的示例结果里housing是300,但根据你添加的两条housing记录300+150=450,应该是笔误啦)
逻辑说明
- add_item函数:把每一条收支详情封装成字典,加入全局的
transactions列表,这样所有记录都会被保存下来,不会被覆盖。 - overview函数:遍历所有记录,筛选出目标年月的项,然后按分类累加金额,最后返回汇总后的字典。
备注:内容来源于stack exchange,提问作者Gary Fortner
相关产品推荐
相关产品推荐

