我已经开始研究python并试图抓住小块的新东西,我为自己设置的最新目标是将一个tab的单独文件浮点数读入内存并比较列表中的值并打印值差异与用户指定的一样大。到目前为止,我已经为它编写了以下代码:
#! /usr/bin/env python
value = raw_input('Please enter a mass difference:')
fh = open ( "values" );
x = []
for line in fh.readlines():
y = [float for float in line.split()]
x.append(y)
fh.close()
for i in range(0,len(x)-1):
for j in range(i,len(x)):
if x[j][0] - x[i][0] == value:
print x[i][0],x[j][0]
编译器抱怨我不允许从字符串中减去字符串(逻辑上),但我的问题是......为什么它们是字符串?嵌套列表不应该是浮点数列表,因为我使用float for float?
字面错误:
TypeError: unsupported operand type(s) for -: 'str' and 'str'
如果有人能告诉我我的推理在哪里出错,我将不胜感激;)
答案 0 :(得分:3)
尝试使用此代替列表理解:
y = [float(i) for i in line.split()]
解释:
您从文件中读取的数据是字符串,以将它们转换为您需要投射它们的其他类型。因此,在您的情况下,您希望通过您尝试过的float()
..将值转换为浮动,但不是非常正确/成功。这应该会给你你想要的结果。
如果您要转换其他值,则此语法将起作用:
float_val = float(string_val)
假设string_val
包含浮点数的有效字符,它将转换,否则您将获得异常。
>>> float('3.5')
3.5
>>> float('apple')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: invalid literal for float(): apple
答案 1 :(得分:2)
列表理解并没有按照您的想法进行。它只是将每个字符串分配给变量float
,然后返回它。相反,你实际上想要使用另一个名称并在其上调用float:
y = [float(x) for x in line.split()]
答案 2 :(得分:2)
错误1 :y = [float(x) for x in line.split()]
或只是map(float,lines.split())
错误2 :if x[j][0] - x[i][0] == float(value): #you didn't converted value to a float