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

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_y
    
    之后在y_value、y_pow、xy_val、pearsons里直接调用这个方法即可。
  • 注意读取features2.csv时,fiturs.insert(0, fiturs[0])会把第一行数据重复插入到列表开头,可能导致后续计算出现重复特征,建议检查是否需要这行代码,不需要的话可以删除。

内容的提问来源于stack exchange,提问作者Fachrul Rozy Saputra R

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:04:13