为什么要显示不支持的操作数类型 - :' tuple'并且'漂浮'

时间:2016-03-01 18:21:18

标签: python

我的代码是下一个

data_temp = [(atributos[0],atributos[1],atributos[2],atributos[3],atributos[4],atributos[5],atributos[6],atributos[7],atributos[8],atributos[9],atributos[10],atributos[11],atributos[12],atributos[13])]


lectura = csv.reader(open("Dataset.csv","r"))
dis = [] #creamos una lista vacia para almacenar las distancias de cada instancia
for index,row in enumerate(lectura):
dato2 = [float(row[0]), float(row[1]),float(row[2]), float(row[3]),float(row[4]),float(row[5]),float(row[6]),float(row[7]),float(row[8]),int(row[9]),int(row[10]),int(row[11]),int(row[12]),int(row[13])]
d = calcular_distancia(data_temp,dato2)

,错误是

def calcular_distancia(d1,d2):
distancia = ((d1[0]-d2[0])**2+(d1[1]-d2[1])**2+(d1[2]-d2[2])**2+(d1[3]-d2[3])**2+(d1[4]-d2[4])**2+(d1[5]-d2[5])**2+(d1[6]-d2[6])**2+(d1[7]-d2[7])**2+(d1[8]-d2[8])**2+(d1[9]-d2[9])**2+(d1[10]-d2[10])**2+(d1[11]-d2[11])**2+(d1[12]-d2[12])**2+(d1[13]-d2[13])**2)
return math.sqrt(distancia)

并使用

完成程序
distancia = ((d1[0]-d2[0])**2+(d1[1]-d2[1])**2+(d1[2]-d2[2])**2+(d1[3]-d2[3])**2+(d1[4]-d2[4])**2+(d1[5]-d2[5])**2+(d1[6]-d2[6])**2+(d1[7]-d2[7])**2+(d1[8]-d2[8])**2+(d1[9]-d2[9])**2+(d1[10]-d2[10])**2+(d1[11]-d2[11])**2+(d1[12]-d2[12])**2+(d1[13]-d2[13])**2)

TypeError: unsupported operand type(s) for -: 'tuple' and 'float'

2 个答案:

答案 0 :(得分:0)

您的d1和d2变量不是浮点数列表。相反,他们是一个元组列表。在您的代码中某些地方,您还没有显示,d1 [i]和d2 [i]被赋予元组值。

另外,要计算距离,我会执行以下操作:如果您有2个浮动列表。 将索引映射到d1和d2平方中相应索引的差值。然后求和平方差异列表。它有助于减少你的长期总结。

return math.sqrt(sum( list(map(lambda i: (d1[i] - d2[i])**2, range(len(d1))))))

答案 1 :(得分:0)

看起来您将一个元组列表作为第一个参数calcular_distancia传递到d1函数中。您可能希望data_temp成为float值的列表,但它实际上是(1)14元素元组的列表,如下所示:

>>> data_temp = [(atributos[0],atributos[1],atributos[2],atributos[3],atributos[4],atributos[5],atributos[6],atributos[7],atributos[8],atributos[9],atributos[10],atributos[11],atributos[12],atributos[13])]
>>> type(data_temp)
<type 'list'>
>>> type(data_temp[0])
<type 'tuple'>
>>> len(data_temp)
1
>>> len(data_temp[0])
14

我怀疑根本问题是,在定义[]时,您使用方括号()和括号data_temp。如果您移除()定义中的data_temp,则应获得预期的结果。