0

我已经开始研究 python 并试图以小块的形式掌握新事物,我为自己设定的最新目标是将一个选项卡单独的浮点文件读入内存并比较列表中的值并打印值,如果差异为大为用户指定。到目前为止,我已经为它编写了以下代码:

#! /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]

编译器抱怨我不允许从字符串中减去字符串(逻辑上),但我的问题是......为什么它们是字符串?当我使用浮点数时,嵌套列表不应该是浮点数列表吗?

字面错误:

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

如果有人能告诉我我的推理哪里出错了,我将不胜感激;)

4

3 回答 3

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
于 2012-07-04T12:35:59.153 回答
2

列表理解并没有做你认为它正在做的事情。它只是将每个字符串分配给变量float,然后返回它。相反,您实际上想使用另一个名称并对其调用 float :

y = [float(x) for x in line.split()]
于 2012-07-04T12:36:50.663 回答
2

错误 1y = [float(x) for x in line.split()]或者干脆map(float,lines.split())

错误 2if x[j][0] - x[i][0] == float(value): #you didn't converted value to a float

于 2012-07-04T12:37:00.930 回答