在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:]]