您可以使用statistics.mean 计算您的平均值,使用csv 库将您的文件解析为行,您永远不需要调用read,除非您真的想要所有文件内容的单个字符串,您可以迭代在一个文件对象上并分割每一行。
from statistics import mean
import csv
def sort_mean(fle):
with open(fle) as f:
for name, *scores in csv.reader(f, delimiter=" "):
srt = sorted(map(int, scores))
print("Highest score for {} is {}".format(name, srt[-1]))
print("Average score for {} is {}".format(name, mean(srt)))
对于您的输入文件,它将输出:
Highest score for Mike is 9
Average score for Mike is 7.0
Highest score for Terry is 7
Average score for Terry is 4.666666666666667
Highest score for Ste is 8
Average score for Ste is 4.333333333333333
现在,如果您想存储所有数据并按顺序输出:
from statistics import mean
import csv
from operator import itemgetter
def sort_mean(fle):
avgs, high = [], []
with open(fle) as f:
for name, *scores in csv.reader(f, delimiter=" "):
srt = list(map(int, scores))
avgs.append((name, mean(srt)))
high.append((name, max(srt)))
avgs.sort(key=itemgetter(1), reverse=1)
high.sort(key=itemgetter(1), reverse=1)
return avgs, high
这将为您提供从最高到最低排序的两个列表:
In [10]: high, avgs = sort_mean("in.txt")
In [11]: high
Out[11]: [('Mike', 7.0), ('Terry', 4.666666666666667), ('Ste', 4.333333333333333)]
In [12]: avgs
Out[12]: [('Mike', 9), ('Ste', 8), ('Terry', 7)]
对于python2,你需要自己计算平均值,循环的逻辑有点不同:
def sort_mean(fle):
avgs, high = [], []
with open(fle) as f:
for row in csv.reader(f, delimiter=" "):
name, scores = row[0], row[1:]
srt = map(int, scores)
avgs.append((name, sum(srt,0.0) / len(srt)))
high.append((name, max(srt)))
avgs.sort(key=itemgetter(1), reverse=1)
high.sort(key=itemgetter(1), reverse=1)
return avgs, high
您可以存储用户得分最高和均值最高的字典,而不是两个列表,并对其中存储的项目进行排序。
关于你自己的函数,你可以改写如下:
def alphabetical():
scoreslist = []
with open ("classa.txt") as f:
# just iterate over the file object
# line by line
for line in f:
# don't need to pass a delimiter
split_line = line.split()
name = split_line[0]
score = split_line[1:]
# use max to get the highscore and use int as the key
# or "123" < "2"
high_score = max(score,key=int)
scores_list.append("{} {}".format(name,high_score))
# don't need lambda to sort alphabetically
scores_list.sort()
print(scores_list)