0

我有一个负浮动列表。我想和他们一起做一个直方图。据我所知,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
4

2 回答 2

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

于 2011-08-11T16:48:58.113 回答
1

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

不,他们不是;它们是表示负小数的字符串列表.split(),因为调用会生成一个列表。maxv并且minv是字符串列表,不能馈送到float().

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

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

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

也就是说,您仍然希望map在调用之前将字符串转换为浮点数,max否则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)
于 2011-08-11T16:58:52.650 回答