无法将字符串列表转换为浮点数

3
我的程序应该读取一个包含一堆数字的文本文档,并且只列出正数。但我无法将文本文档中的字符串转换为浮点数,因此无法确定它们是否为正数。
由于复制粘贴存在问题,我附上了一张截图。

http://i.stack.imgur.com/L1Z7z.png

http://i.stack.imgur.com/L1Z7z.png

没有 float(number) 这个操作,我得到的结果是 ['3.7', '-22', '3500', '38', '-11.993', '2200', '-1', '3400', '3400', '-3400', '-22', '12', '11', '10', '9.0']
3个回答

5
你可以很容易地将该列表转换为浮点数:
>>> nums = ['3.7', '-22', '3500', '38', '-11.993', '2200', '-1', '3400', '3400', '-3400', '-22', '12', '11', '10', '9.0']
>>> map(float, nums)
[3.7, -22.0, 3500.0, 38.0, -11.993, 2200.0, -1.0, 3400.0, 3400.0, -3400.0, -22.0, 12.0, 11.0, 10.0, 9.0]

但问题似乎是您的文件中的行不包含单独的浮点数。当您调用float(number)时,number是来自文件的一行,在该行中(从错误消息中可以看出),包含三个用空格分隔的数字“3.7 -22 3500”。
您需要在拆分后调用float函数。
for line in f:
  for numberString in line.split()
    number = float(numberString)
    if(number > 0)
      numbers.append(number)

或者更具功能性:
for line in f:
  numbers.extend([n for n in map(float, line.split()) if n > 0])

lst = filter(None, itertools.chain(map(float, line.split()) for line in f)) - agf
啊,好的。我忘记了你可以添加到其中的条件if语句。谢谢! - Rob Blaze
也许你可以再帮我一次。我需要将那个列表按照它们的顺序打印到一个文本文档中,每行一个。我无法想出如何调用无限数量的数字而不是使用range函数。 - Rob Blaze
现在需要 list(map(float, nums))。 - E L

2
首先,不要将变量命名为list,这样会覆盖内置的list函数。
以下是改进后的代码:
li = []

for line in open("numbers.txt"):
    nums = line.split() # split the line into a list of strings by whitespace
    nums = map(float, nums) # turn each string into a float
    nums = filter(lambda x: x >= 0, nums) # filter the negative floats

    li.extend(nums) # add the numbers to li

我喜欢使用 map()(比列表推导式更优雅)。但是我认为 nums = [ x for x in nums if x > 0 ]filter() 更好看 - 只是我的个人意见。 - Li-aung Yip
不需要去除尾随空格,split()函数会自动处理:"has trailing\n".split()将返回['has', 'trailing'] - dhg

2

读取文件内容后,需要按空格分割内容并单独解析每个数字。现在正在尝试将字符串“3.7 -22 3500”作为单个浮点数解析,这是不可能的。

>>> float('3.7 -22 3500')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for float(): 3.7 -22 3500

谢谢!我从下面的某个人那里得到了答案,但是你的解释帮助我理解了我的错误。 - Rob Blaze

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接