报错'takes 1 positional argument but 3 were given'及Python数据处理代码求助
问题排查与代码修复方案
嘿,我来帮你搞定这个问题!首先咱们拆解那个'takes 1 positional argument but 3 were given'错误,然后一步步把代码修复好。
1. 错误原因分析
这个报错大概率是两种情况导致的:
- 你调用
splitData时传入了3个参数,但函数定义只接受2个(dataset和splitRatio) - 你的
loadCSV函数存在bug,返回的数据集格式异常,间接引发调用问题
不过咱们先把两个函数的问题都彻底解决掉。
2. 修复loadCSV函数
你原来的loadCSV犯了个关键小错误:创建了csv.reader解析器后,却直接把文件对象转成列表,没有用解析器来读取结构化的csv数据。这样得到的是原始行字符串,不是咱们需要的数值列表。修正后的代码如下:
import csv import random import math def loadCSV(filename): with open(filename, 'r') as lines: # Python3里不用'rb',用'r'避免编码问题 reader = csv.reader(lines) dataset = list(reader) # 用csv解析器生成结构化列表,而非直接读取文件行 for i in range(len(dataset)): # 如果你的csv有表头,就跳过第一行;没有表头可以删掉这个判断 if i == 0: continue # 将每行字符串转为浮点数 dataset[i] = [float(x) for x in dataset[i]] # 过滤表头行(如果存在) dataset = dataset[1:] if dataset else dataset return dataset
3. 完善splitData函数
你写了一半的splitData我帮你补全了,这个函数会按指定比例随机拆分训练集和测试集,核心逻辑是从复制的数据集里随机抽取样本,剩下的自动成为测试集:
def splitData(dataset, splitRatio): train_size = int(len(dataset) * splitRatio) train_set = [] copy = list(dataset) # 复制原数据集,避免修改原始数据 # 随机抽取训练样本 while len(train_set) < train_size: # 生成随机索引,取出对应数据加入训练集 index = random.randrange(len(copy)) train_set.append(copy.pop(index)) # 剩下的copy就是测试集 test_set = copy return train_set, test_set
4. 正确的调用方式
确保调用splitData时只传两个参数:数据集和分割比例,示例如下:
filename = 'blood-primal.csv' dataset = loadCSV(filename) print(f"Load data file {filename} with {len(dataset)} rows") # 按7:3比例拆分数据集,splitRatio设为0.7 train_dataset, test_dataset = splitData(dataset, 0.7) print(f"训练集大小:{len(train_dataset)},测试集大小:{len(test_dataset)}")
再复盘那个错误
如果之前你调用splitData时传了3个参数(比如splitData(dataset, 0.7, True)),那肯定会触发这个报错,因为函数定义只接受2个位置参数。现在按照上面的方式调用,问题就解决啦。
内容的提问来源于stack exchange,提问作者Chris Sowden
相关产品推荐
相关产品推荐

