我正在尝试编写一个函数,该函数读取包含具有相应分数(浮点数)的名称的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;谁能看到任何突出的错误? 再次感谢
答案 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)