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

时间:2014-06-13 06:26:12

标签: python function

我正在尝试编写一个函数,该函数读取包含具有相应分数(浮点数)的名称的txt文档,例如。 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) 

我正在通过(Pyschools)学习python的网站将返回正确的结果,但声明“私人测试失败”#39;谁能看到任何突出的错误? 再次感谢

1 个答案:

答案 0 :(得分: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)