我有一个负浮动列表。我想用它们做直方图。据我所知,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
答案 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()
调用会产生一个列表。 maxv
和minv
是字符串列表,无法输入float()
。
引用的错误是什么,我该如何解决?
它指的是val
的内容不是您认为的那样。调试的第一步是验证您的假设。如果您在REPL中尝试此代码,那么您可以检查maxv
和minv
的内容,并注意您有字符串列表而不是预期的字符串。
我假设你想把所有字符串列表(从文件的每一行)放在一个字符串列表中。使用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)