编写一个函数返回数字列表的平均值

0 投票
1 回答
1595 浏览
提问于 2025-04-18 09:38

我正在尝试写一个函数,这个函数可以读取一个文本文件,里面包含了名字和对应的分数(小数),比如说 Li Ning, 9.8 9.7 9.6 9.3 9.4 9.8。每个名字(选手)和对应的分数都在文件的新一行上。这个函数应该返回最高的平均分和对应的名字。计算平均分的时候,要先去掉最高分和最低分。

def getWinner(filename):
    results = open(filename)
    results.readlines()
    winner = ''
    max_score = 0
        for line in results:
            tokens = line.split(',')    # split line using ',' separator   
            name = tokens[0]                 # get the name
            scores = sorted(map(float, tokens[1].split()))

            ave = [sum(scores[i])for i in range(1, len(scores)-1)]/(len(scores)-2)
            if ave > max_score:
                   winner = name           
                   max_score = ave        

return "%s [%d]" % (winner, max_score)

我遇到的错误是 Cannot iterate float,我猜这个问题出在我计算平均分的部分。为什么会这样呢?

感谢大家提供的有用建议!这是我更新后的代码:

def getWinner(filename): 
    results = open(filename).readlines()        
    winner = ''   
    max_score =0 


    for line in results:
        tokens = line.split(',')    
        name =  tokens[0]                
        scores = map(float, tokens[1].split()) 
        ave = sum(scores[1:-1])/(len(scores) - 2)                    
        if ave > max_score:
           winner = name             
           max_score = ave         

    return "%s [%.1f]" % (winner, max_score) 

我在学习Python的网站(Pyschools)上运行代码时,能得到正确的结果,但却显示“私有测试失败”。有没有人能看到有什么明显的错误?再次感谢!

1 个回答

2

我觉得你的问题出在计算平均值的部分。你现在的做法是:

ave = [sum(scores[i])for i in range(1, len(scores)-1)]/(len(scores)-2)

这里的括号表示的是列表推导式。result = [ f(x) for x in iterable ] 其实是等同于:

result = []
for x in iterable:
    result.append(f(x))

所以在你的代码中,它的意思是:

ave = []
for x in range(1, len(scores) - 1):
    ave.append(sum(scores[x]))

这样并不是你想要的结果。另外,调用sum函数时如果只给它一个数字,它会出错,因为sum需要一个可迭代的对象才能工作。然后,你还在用一个整数去除一个列表,这样在Python中也会出错。

所以我建议你使用以下的平均值计算方法:

ave = sum(scores[1:-1])/(len(scores) - 2)

撰写回答