在此仅将原文代码要做的修改附上
修改前 '''def loadDataSet(self,path,labels):
d="/t"
d=d.encode(encoding="utf-8")
recordlist=[]
fp=open(path,"rb")
content=fp.read()
# print(content)
fp.close()
rowlist=content.splitlines()
print(rowlist)
recordlist=[row.split(d)for row in rowlist if row.strip()]
print(recordlist)
self.dataSet=recordlist
self.labels=labels
'''出错主要是recordlist=[row.split(d)for row in rowlist if row.strip()]会提示d类型错误,为此笔者将d强制转换后可运行,但发现self.dataSet所构成的列表阵列打印出来'0\t0\t0\t0\tno'形如此,其长度为1,表现为一个字符串,并不是文中想得到的[0.0, 0.0, 0.0, 0.0, 'no']这种形式的列表,所以后边计算都是错的,无法得出书本上的答案。考虑到这,将主要矛头对准这个loadData函数,查阅类似读取文件数据博客,资料,均未找到直接将 0 0 0 0 no这样的文本读出来并作为列表的代码,在翻看list相关资料时候看到列表相加便可得到所求列表,于是做以下尝试
将文本数据的数据信息与英文字符分开存储,数据字符先采用矩阵存储,然后利用tolist()函数转换为list 然后与英文列表相加实现所求形式的列表,最终得解,具体如下
def loadDataSet(self,path,labels):
fp = open(path)lines= fp.readlines() #逐行读取文件
numberOfLines = len(lines) #获取文件的行数
returnMat = zeros((numberOfLines,4)) #创建一个矩阵
decVector = [] #存储决策标签向量
index = 0
for line in lines:
line = line.strip() #删除所有换行符
listFromLine = line.split('\t') #通过指定分割符对字符串切分
returnMat[index,:]=listFromLine[0:4]
classLabelVector.append((listFromLine[-1]))
index+=1
Matrix=returnMat.tolist()
index1=0;
for i in range(numberOfLines):
Matrix[index1]+=[classLabelVector[index1]];#[]必须加
#将classLabelVector[index]取出来的元素转换为列表然后完成相加否则报错
index1+=1
self.dataSet=Matrix
self.labels=labels
至此修改完毕,个人见解,如有其它简便方法,求留言指正