【问题标题】:Error "unsupported operand type(s) for -: 'str' and 'float'?错误“-: 'str' 和 'float' 的操作数类型不受支持?
【发布时间】:2018-12-26 09:01:08
【问题描述】:

这段代码可以完美地找到它引用的文件中数字的平均值,但是我似乎无法让它找到标准偏差。 标准差公式为:平方根/(n1-a)^2+(n2-a)^2/m

-一切都在平方根之下我找不到它的字符

-N1,N2.....Nm=列表中被引用的数字

-a=平均

-m=列表中数字的总数

这就是我所拥有的,

def main():
    numbersFile=open("RandomNumber.txt" , 'r')

    line=numbersFile.readline()
    total=0
    numberoflines=0

    while line != "":
        numberoflines+=1
        total+=int(line)
        line=numbersFile.readline().strip()
    average=total/numberoflines
    std=line-average
    deviation=(std**2)/numberoflines


    print("The average is: " , average)
    print("The standard deviation of the numbers is: " , deviation)


main()        

【问题讨论】:

  • 大概这行std=line-average linestr 所以错误很明显
  • 你建议我如何转换它?
  • 请注意 numberoflines 可能包含非数字字符
  • @JaredVenson 你试过在你的线路上使用float() 函数吗?
  • @joel 是的,似乎仍然无法正常工作

标签: python python-3.x


【解决方案1】:

您的line 变量是file.readline() 返回的字符串。您需要先将其转换为float,然后才能使用另一个浮点数执行减法。

变化:

std=line-average

到:

std=float(line)-average

【讨论】:

  • std=float(line)-average ValueError: could not convert string to float:
  • 确保文件中的所有行都是有效数字。
  • 是的,平均值打印得很好
  • 现在我重新阅读了您的代码,我发现 lin 必须是一个空字符串才能打破 while 循环,因此您的 std=line-average 中的 line 始终是空字符串,因此当您尝试将其转换为 float 时会生成 ValueError。您需要重写循环,以便在循环内为输入行的每个值计算 std
  • 这很困难,因为需要先定义平均值,然后才能在标准方程中调用它
【解决方案2】:

看看这个question关于try/exceptisdigit(),在那之后 在计算偏差之前进行一些强制转换以浮动,如下所示:

std=float(line)-float(average)
deviation=float((std**2))/float(numberoflines)

另外请注意,line=numbersFile.readline() 中的 可能包含非数字字符,请仔细检查您的输入。因为您在 std=line-average 中使用 line 并且您确定 average 是正确的,所以问题出在 linestd 得到错误的值。

【讨论】:

  • 通过测试我的错误是无法将字符串转换为浮点数。行:std=float(line)-float(average)
【解决方案3】:

要计算的正确源代码:

import math
def main():
numbersFile=open("RandomNumber.txt" , 'r')

line=numbersFile.readline()
total=0
numberoflines=0

while line != "":

    numberoflines+=1
    total+=float(line)


    line=numbersFile.readline().rstrip('\n')
numbersFile.seek(0)
average=total/numberoflines
line=numbersFile.readline()
total=0
while line !="":
    line=float(line)-average
    a=line**2
    total+=a
    line=numbersFile.readline()
std=math.sqrt(total/numberoflines)







print("The average is: " , average)

print("The standard deviation of the numbers is: " , std)


main()

【讨论】:

    猜你喜欢
    • 2022-12-03
    • 2013-05-08
    • 1970-01-01
    • 2018-03-29
    • 2017-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多