You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现按年月筛选收支项并汇总分类金额的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,应该是笔误啦)

逻辑说明

  1. add_item函数:把每一条收支详情封装成字典,加入全局的transactions列表,这样所有记录都会被保存下来,不会被覆盖。
  2. overview函数:遍历所有记录,筛选出目标年月的项,然后按分类累加金额,最后返回汇总后的字典。

备注:内容来源于stack exchange,提问作者Gary Fortner

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.23 07:17:59