PYTHON 负小数问题

1 投票
2 回答
8922 浏览
提问于 2025-04-16 23:24

我有一串负的小数,我想用它们做一个直方图。根据我所知道的,Python 不能处理负数,这是真的吗?我的列表是这样的:[-0.2923998, -1.2394875, -0.23086493,等等]。我想找出最大值和最小值,以便确定范围。可是我的代码出现了错误:

setrange = float(maxv) - float(minv)
TypeError: float() argument must be a string or a number

这是我的代码:

f = open('clusters_scores.out','r')
#first, extract all of the sim values
val = []
for line in f:
    lineval = line.split()
    print lineval
    val.append(lineval)
print val
#val = map(float,val)
maxv = max(val)
minv = min(val)
setrange = float(maxv) - float(minv)

所有放进 'val' 列表里的值都是负的小数。这个错误是指什么,我该怎么修复它呢?

输入文件的内容看起来是这样的:

-0.0783532095182 -0.99415440702 -0.692972552716 -0.639273674023 -0.733029194040.765257900121 -0.755438339963
-0.144140594077 -1.06533353638 -0.366278118372 -0.746931508538 -1.02549039392 -0.296715961215
-0.0915937502791 -1.68680560936 -0.955147543358
-0.0488457137771 -0.0943080192383 -0.747534412969 -1.00491121699
-1.43973471463
-0.0642611118901 -0.0910684525497
-1.19327387414 -0.0794696449245
-1.00791366035 -0.0509749096549
-1.08046507281 -0.957339914505 -0.861495748259

2 个回答

1

所有放入'val'列表中的值都是负小数。

其实不是;它们是表示负小数的字符串列表,因为.split()这个操作会生成一个列表。maxvminv都是字符串列表,不能直接用float()来处理。

这个错误指的是什么,我该怎么修复?

这个错误是因为val中的内容并不是你想的那样。调试的第一步是确认你的假设。如果你在REPL环境中试试这段代码,就可以检查maxvminv的内容,发现它们是字符串列表,而不是你期待的字符串。

我猜你是想把每行文件中的字符串列表合并成一个单一的字符串列表。你应该用val.extend(lineval)而不是val.append(lineval)

另外,在调用maxmin之前,你还是需要把字符串转换成浮点数,因为否则你是在比较字符串,而不是浮点数。(虽然可能会有效,但明确的做法总是比模糊的好。)

更简单的方法是一次性读取整个文件并进行分割;.split()不带参数时会根据空白字符分割,而换行符也是空白字符。你也可以在读取的同时进行映射,使用列表推导式来实现。我会这样写:

with open('clusters_scores.out') as f:
  val = [float(x) for x in f.read().split()]
result = max(val) - min(val)
6

split()的结果是一个分割后的值的列表,这可能就是你遇到那个错误的原因。

举个例子,如果你执行 '-0.2'.split(),你会得到一个只包含一个值的列表 ['-0.2']

编辑:哦!根据你提供的输入文件,问题似乎出在这里:-0.733029194040.765257900121。我想你是想把它分成两个不同的浮点数吧?

假设有一个修正过的文件,像这样:

-0.0783532095182 -0.99415440702 -0.692972552716 -0.639273674023 -0.733029194040 -0.765257900121 -0.755438339963
-0.144140594077 -1.06533353638 -0.366278118372 -0.746931508538 -1.02549039392 -0.296715961215
-0.0915937502791 -1.68680560936 -0.955147543358
-0.0488457137771 -0.0943080192383 -0.747534412969 -1.00491121699
-1.43973471463
-0.0642611118901 -0.0910684525497
-1.19327387414 -0.0794696449245
-1.00791366035 -0.0509749096549
-1.08046507281 -0.957339914505 -0.861495748259

下面的代码将不再抛出那个异常:

f = open('clusters_scores.out','r')
#first, extract all of the sim values
val = []
for line in f:
    linevals = line.split()
    print linevals
    val += linevals
print val
val = map(float, val)
maxv = max(val)
minv = min(val)
setrange = float(maxv) - float(minv)

我已经把代码改成从 split() 得到的列表结果进行连接,而不是追加,这样只要你的文件里有有效的输入就可以正常工作。

撰写回答