编写一个函数返回数字列表的平均值
我正在尝试写一个函数,这个函数可以读取一个文本文件,里面包含了名字和对应的分数(小数),比如说 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)