在python中转换为float,然后转换为int时出错
奇怪的错误发生了在python中转换为float,然后转换为int时出错,python,casting,floating-point,int,long-integer,Python,Casting,Floating Point,Int,Long Integer,奇怪的错误发生了 >>> l = [None, None, None] >>> k = 0 >>> l[k] = [k for k in range(3)] >>> print k, l 2 [None, None, [0, 1, 2]] 我知道尝试将带小数的字符串直接转换为整数的问题: int(float('0.0')) 工作,而 整数('0.0') 没有。然而,我仍然得到一个我似乎无法理解的错误: field = l
>>> l = [None, None, None]
>>> k = 0
>>> l[k] = [k for k in range(3)]
>>> print k, l
2 [None, None, [0, 1, 2]]
我知道尝试将带小数的字符串直接转换为整数的问题:
int(float('0.0'))
工作,而
整数('0.0')
没有。然而,我仍然得到一个我似乎无法理解的错误:
field = line.strip().split()
data[k,:] = [int(float(k)) for k in field[1:]]
ValueError:以10为基数的long()的文本无效:“0.0”
你知道这里会发生什么吗?剧本似乎认为这是一个长距离的演员阵容,而不是浮动。有没有别的办法说服它
提前谢谢
编辑:数据行
的形式如下:
'c1c9r2r8\t0.0\t3.4\t2.1\t9.0\n'
您的错误来自作业的左侧
数据[k,:]=…
。在这里,您试图用字符串(k
)为NumPy数组(data
)建立索引。NumPy试图将该字符串隐式转换为可用的整数索引,但失败了。例如:
>>> import numpy as np
>>> data = np.arange(12).reshape(3, 4)
>>> data['3.4', :] = 6
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: invalid literal for long() with base 10: '3.4'
>>将numpy作为np导入
>>>数据=np.arange(12)。重塑(3,4)
>>>数据['3.4',:]=6
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
ValueError:以10为基数的long()的文本无效:“3.4”
在这里使用整数而不是字符串,问题应该会消失。似乎发生的是列表理解正在污染您的命名空间 例如 在Python2.x中执行上述代码后,
k
的值将是9
(由range(10)
生成的最后一个值)
我将简化您的代码以向您展示正在发生的事情
>>> l = [None, None, None]
>>> k = 0
>>> l[k] = [k for k in range(3)]
>>> print k, l
2 [None, None, [0, 1, 2]]
您可以看到,l[k]
计算为l[2]
,而不是l[0]
。为了避免这种名称空间污染,请不要在列表理解中使用与在外部代码中相同的变量名,或者使用Python3.x,其中列表理解的内部变量不再转义到外部代码中
对于python 2.x,您的代码应该修改为:
data[k,:] = [int(float(_k)) for _k in field[1:]]
因为“0.0”是有道理的。它不能转换整数。你没有抓住要点。以交互方式启动python并输入int(float('0.0')返回0。尝试
int(0.0)
(排除单引号)在data[k,:]中k
是什么?您是否打算使用字段的最后一个值为数据
编制索引?如果您是,那么这段代码非常不清楚,并且不会在Python3.xIt中工作!谢谢你,@Puffin GDI!如果我可以问的话,你知道为什么上述方法不起作用吗?我想这也是有效的。也许你可以通过提问来检查你的代码<代码>数据[k,:]
或其他错误:啊,你完全正确。我没听清楚。我以为我疯了!
data[k,:] = [int(float(_k)) for _k in field[1:]]