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

Python代码运行报TypeError,请求排查嵌套函数与CSV处理问题

问题排查与代码修正

核心错误及修复点

  • 字典方法调用错误:data.items需改为data.items(),因为items是字典的内置方法,必须通过括号调用才能生成可迭代的键值对集合,否则直接引用方法对象会触发TypeError: 'builtin_function_or_method' object is not iterable。
  • 未正确接收文件读取结果:main函数中调用read_file(filename)后,没有将返回值赋值给data,且read_file原本返回的results列表毫无用处,应该让read_file返回整理好的批次数据字典。
  • 批次数据格式错误:read_file中data[batch] += [float(four_vals[1]), float(four_vals[2]), float(four_vals[3])]会把单个样本的三个值拆成独立元素追加,导致后续遍历三元组时解包失败,需改为追加三元组元组data[batch].append( (float(four_vals[1]), float(four_vals[2]), float(four_vals[3])) )。
  • 除以零风险处理:当批次中无符合条件的样本时,n为0,需添加判断避免ZeroDivisionError。

修正后的完整代码

def read_file(filename): 
    data = {}
    with open(filename, 'r') as h:
        for line in h:
            four_vals = line.strip().split(',')  # 去除换行符,避免末尾空元素
            batch = four_vals[0]
            if batch not in data:
                data[batch] = []
            # 追加三元组,保持每个样本的结构
            data[batch].append( (float(four_vals[1]), float(four_vals[2]), float(four_vals[3])) )
    return data 

def check_statement(x,y): 
    return x**2 + y**2 <= 1  # 简化返回逻辑

def calculate_values(sample): 
    n = 0
    x_sum = 0
    for (x, y, val) in sample:
        if check_statement(x,y):
            x_sum += val
            n += 1
    return x_sum / n if n != 0 else 0.0  # 处理n为0的情况

def main():
    filename = input('Which csv file should be analyzed? ')
    data = read_file(filename)  # 接收读取的批次数据
    print("Batch \t Average")
    
    for batch, sample in data.items():  # 调用items()方法
        avg = calculate_values(sample)
        print(batch, "\t", avg)

if __name__ == "__main__":
    main()

补充说明

  • 新增line.strip()处理每行末尾的换行符,避免拆分后出现空字符串元素。
  • 简化check_statement函数的返回逻辑,直接返回布尔表达式结果。
  • 添加if __name__ == "__main__":确保主函数仅在直接运行脚本时执行,符合Python规范。

内容的提问来源于stack exchange,提问作者pythonhelpneeded

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 13:05:17