Python报错:unsupported operand type(s) for +: 'int' and 'list' 求解
如何解决皮尔逊相关系数计算中的TypeError错误?
背景数据(CSV格式)
F1,1,1,1,1,0,1,1,0,0,1 F2,1,0,0,0,0,0,1,0,1,1 F3,1,0,0,0,0,0,1,1,1,1 F4,1,0,0,0,0,0,1,1,1,0 F5,14,24,22,22,22,16,18,19,26,22 F6,8.0625,6.2,6.2609,6.6818,6.2174,6.3333,7.85,6.0833,6.9655,6.9167 F7,0,0,0,0,0,0,1,0,1,0 F8,1,0,2,0,0,0,2,0,0,0 F9,1,0,0,0,1,1,0,0,0,0 F10,8,4,3,3,3,6,8,5,8,4 F11,0,0,1,0,0,1,0,0,0,0 F12,1,0,0,0,1,0,1,1,1,1
编写的Python代码
import csv import math import copy class Pearsons: def __init__(self,fiturs,docs): self.fiturs = fiturs self.docs = docs def x_value(self): sumx = [] for fitur in self.fiturs: x = sum(([float(x)]) for x in fitur[1:]) sumx.append(x) print sumx def x_pow(self): sumxp = [] for fitur in self.fiturs: xval_pow = sum([float(x)**2 for x in fitur[1:]]) sumxp.append(xval_pow) return sumxp def y_value(self): sumy = [] for dokumen in self.docs: if dokumen[2] == "POSITIF": sumy.append(1) else: sumy.append(0) sigma_y = sum(sumy) return sigma_y def y_pow(self): sumy = [] for dokumen in self.docs: if dokumen[2] == 'POSITIF': sumy.append(1) else: sumy.append(0) ypow = [] for x in sumy: ypow.append(x ** 2) sigmapow = sum(ypow) return sigmapow def xy_val(self): list_y = [] for dokumen in self.docs: if dokumen[2] == 'POSITIF': list_y.append(1) else: list_y.append(0) # print list_y sigmaxy = [] for xyfitur in self.fiturs: xy = [] for i, x in enumerate(list_y): xy.append(float(xyfitur[i]) * list_y[i]) sigmaxy.append(sum(xy)) return sigmaxy def pearsons(self): list_y = [] for dokumen in self.docs: if dokumen[2] == 'POSITIF': list_y.append(1) else: list_y.append(0) # Assume len(x) == len(y) n = len(list_y) sigmax = self.x_value() sigmay = self.y_value() sigmaxpow = self.x_pow() sigmaypow = self.y_pow() sigmaxy = self.xy_val() rpxy_list = [] for i, v in enumerate(sigmax): rpxy_top = (n * sigmaxy[i]) - (sigmax[i] * sigmay) rpxy_bot = math.sqrt((n * sigmaxpow[i]) - (sigmax[i] ** 2)) * math.sqrt((n * sigmaypow) - (sigmay ** 2)) if rpxy_bot == 0: rpxy_list.append(0) else: rpxy_list.append(abs(rpxy_top / rpxy_bot)) #print rpxy_list return rpxy_list fiturs = [] docs = [] with open("features2.csv", "rb") as f: fiturcsv = csv.reader(f, None) fiturs = [x for x in fiturcsv] fiturs.insert(0, fiturs[0]) with open("datalatih.csv", "rb") as f: docscsv = csv.reader(f) docs = [x for x in docscsv] p = Pearsons(fiturs, docs) # nb.BernoulliNaiveBayes() p.x_value() #p.xy_val()
触发的错误信息
C:/Users/USER/PycharmProjects/Skripsi/coba.py Traceback (most recent call last):
File "C:/Users/USER/PycharmProjects/Skripsi/coba.py", line 117, in
p.x_value()
File "C:/Users/USER/PycharmProjects/Skripsi/coba.py", line 14, in x_value
x = sum(([float(x)]) for x in fitur[1:])
TypeError: unsupported operand type(s) for +: 'int' and 'list'
问题分析与解决方案
错误原因
在x_value方法里,你写了sum(([float(x)]) for x in fitur[1:])——这里的生成器每次返回的是一个包含单个浮点数的列表,而sum()函数默认是把这些元素相加,但列表和整数(或列表和列表)不能直接用+运算,所以抛出了类型错误。
修复方法
只需要去掉多余的方括号,直接生成浮点数的迭代器即可:
def x_value(self): sumx = [] for fitur in self.fiturs: # 移除包裹float(x)的方括号,生成浮点数迭代器而非列表迭代器 x = sum(float(x) for x in fitur[1:]) sumx.append(x) print sumx
额外优化建议
- 你在多个方法里重复了生成
list_y的逻辑,可以把它提取成一个单独的辅助方法,避免代码冗余:
之后在def get_y_list(self): list_y = [] for dokumen in self.docs: list_y.append(1 if dokumen[2] == "POSITIF" else 0) return list_yy_value、y_pow、xy_val、pearsons里直接调用这个方法即可。 - 注意读取
features2.csv时,fiturs.insert(0, fiturs[0])会把第一行数据重复插入到列表开头,可能导致后续计算出现重复特征,建议检查是否需要这行代码,不需要的话可以删除。
内容的提问来源于stack exchange,提问作者Fachrul Rozy Saputra R
相关产品推荐
相关产品推荐

