在Python中寻找一组数字的平均值需要帮助。

4

在我的数据文件中,我有

60,66,88,90,44,90,80,77

所有数字都在一行中

这是我的代码,它没有给我数字的平均值

    inFile3 = open("data2.txt","r") 
    global gradeVar 
    gradeVar = len(gradeArray) 
    global Total 
    Total = 0 
    for Numbers in inFile3: 
            Total = Total + int(Numbers) 
    inFile3.close() 
    global averageVar 
    averageVar = Total/gradeVar 
    return averageVar 

这是错误信息

Traceback (most recent call last):
  File "program.py", line 81, in <module>
    main()
  File "program.py", line 5, in main
    averageVar = Average() 
  File "program.py", line 39, in Average
    Total = Total + int(Numbers) 
ValueError: invalid literal for int() with base 10: '60,66,88,90,44,90,80,77\n'

7
那些 global 声明都是干什么的?把它们去掉。 - Daniel Roseman
6个回答

5
您的问题在这里:
for Numbers in inFile3: 
        Total = Total + int(Numbers)

在上面的代码中,Numbers 是一系列行的列表,而不是数字列表。
for Line in inFile3:
    for number in Line.split(','):
        Total = Total + int(number)

应该有所帮助。

在Python中,您无需像其他语言那样预先声明变量。实际上,使用global这样做是很危险的,除非您知道自己在做什么以及为什么要这样做。

编辑: 如果您在一行末尾有逗号或空值,可以将最后一行更改为:

        if number.strip():
            Total = Total + int(number)

这将忽略任何可能导致错误的“空”数字字符串。

请记得处理末尾的换行符 '\n'。否则,答案是正确且清晰的。+1 等待处理换行符。 - Steven Rumbalski
int(string)会忽略空格(包括\n)。当然,行末的逗号会导致问题!稍后将添加一个编辑来处理可能出现的情况... - mavnn
我不知道 int(string) 会忽略空格。谢谢! - Steven Rumbalski

2

此行:

for Numbers in inFile3:

实际上是在遍历文件的每一行,而不是每一行中的数字。您需要遍历每一行,然后将其拆分为数字,例如:

for Line in inFile3: 
    for Number in Line.split(','): 
        Total = Total + int(Number) 

2

虽然其他人已经指出了你所做的一些问题,但没有人指出一个平均值不仅需要所有部分的总和,还需要所有元素的数量。因此,

def parseNumberFile(file_name):
    for numbers in open(file_name, "r"):
        items = numbers.split(',')
        yield (len(items), sum(map(int,items)))

将其转换为生成器,您可以将其用作以下内容:
total = 0
count = 0
for x,y in parseNumberFile("myData.txt"):
    count += x
    total += y
average = total/count

Python非常优秀,但是对于提问者展示的专业水平来说,这个答案可能过于复杂了。 - Steven Rumbalski
1
但是通过一些文档浏览,它可以产生(哈)非常易读的代码。 - mavnn

1

你在哪里读取数据? 你需要读取它,然后使用类似 str.split() 的方法将字符串拆分为数字。

这里有一种更符合Python风格的方法:

inFile3 = open("data2.txt","r") 
grade_list = inFile3.readline()
inFile3.close()
num_list = [int(g) for g in grade_list.split(',')]
average = sum(num_list) / len(num_list)
print average

1
错误信息已经说明了一切:'60,66,88,90,44,90,80,77\n',作为一个组,不是有效的整数。你需要逐个考虑它们。首先去掉换行符,然后按逗号分割。
修改为:
for Numbers in inFile3: 

To:

# assumes numbers are all on one line with no spaces between
for Numbers in inFile3.read().strip().split(','):

如果我必须从头开始重写:
from __future__ import division  # this import is not needed in python 3
with open('data2.txt', 'r') as f:
    numbers = [int(n) for n in f.read().strip().split(',')]
    avg = sum(numbers) / len(numbers)

0

更改

for Numbers in inFile3: 

for Numbers in inFile3.strip().split(','): 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接