具有负小数的PYTHON问题

时间:2011-08-11 16:43:41

标签: python list floating-point max min

我有一个负浮动列表。我想用它们做直方图。据我所知,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 个答案:

答案 0 :(得分:5)

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()获取列表结果并将其连接到列表,而不是附加它,只要文件中有有效输入,它就会起作用。

答案 1 :(得分:1)

  

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

不,他们不是;它们是 字符串列表,表示负小数,因为.split()调用会产生一个列表。 maxvminv是字符串列表,无法输入float()

  

引用的错误是什么,我该如何解决?

它指的是val的内容不是您认为的那样。调试的第一步是验证您的假设。如果您在REPL中尝试此代码,那么您可以检查maxvminv的内容,并注意您有字符串列表而不是预期的字符串。

我假设你想把所有字符串列表(从文件的每一行)放在一个字符串列表中。使用val.extend(lineval)而不是val.append(lineval)

也就是说,在调用mapmax之前,你仍然希望将min字符串放入浮点数中,否则你将把字符串比作字符串而不是浮点数。 (它可能很有效,但显式优于隐式。)

更简单,只需立即读取整个文件并将其拆分;不带参数的.split()在空格上分割,换行符是空格。您还可以在阅读的同一点执行map ping操作,并仔细应用列表推导。我会写:

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