下面一份学习成绩单,保存在score.txt文件里
小明,93,95,80
小刚,93,92,80
小刘,90,95,90
小张,96,97,98
小王,92,93,85
四列数据分别是学生姓名,语文,数学,英语成绩,请实现下面的函数
def sort_stu_score(score_file, new_score_file):
"""
读取score_file里的分数信息,根据总分从高到低排序,将排序后的信息输出到new_score_file文件中
:param score_file:
:param new_score_file:
:return:
"""
score_lst = []
with open(score_file, encoding="utf-8")as f:
for line in f:
score_lst.append(line.strip())
使用with语句打开文件,考虑到内容中包含中文,因此指定encoding参数为utf-8,f是可迭代对象,使用for循环遍历读取每一行数据,line.strip()方法会去除字符串前后的回车,换行,空格等特殊字符,最后将一行数据(字符串)加入到列表score_lst中
需要计算学生的总成绩,而列表score_lst存储的是字符串,例如"小明,93,95,80", 为了计算总成绩,需要将字符串以逗号分隔
for index, item in enumerate(score_lst):
array = item.split(",")
score_sum = 0
for i in range(1, len(array)):
score_sum = int(array[i]) + score_sum
score_lst[index] = (item, score_sum)
分隔后得到的array是一个列表,内容类似['小明', '93', '95', '80'], 遍历这个列表,将后面3项字符串转换为int烈性数据并相加。
最关键的是score_lst[index] = (item, score_sum), 这一条语句根据索引index修改列表score_lst里的数据,将原来的字符串修改为元组,为后面的排序做准备,现在score_lst的内容变为
[('小明,93,95,80', 268), ('小刚,93,92,80', 265),
('小刘,90,95,90', 275), ('小张,96,97,98', 291),
('小王,92,93,85', 270)]
下面使用列表的sort方法进行排序
score_lst.sort(key=lambda x:x[1], reverse=True)
key是排序用的字段,使用lambda表达式返回可用于排序的字段,这里的x是传入lambda的参数,实际调用过程中是列表score_lst的数据,score_lst中的数据都是元组,可以用于排序的是总分,也就是x[1],reverse=True 表示倒序,这样就实现了从大到小的排序。
with open(new_score_file, 'w', encoding="utf-8")as f:
for item in score_lst:
f.write(item[0] + "\n")
写文件要用w模式,循环遍历score_lst, 注意写的时候,我们要写入的是元组中的第1个元素item[0], 每一行都要在后面加上\n 表示换行。
排序后的文件内容
小张,96,97,98
小刘,90,95,90
小王,92,93,85
小明,93,95,80
小刚,93,92,80
def sort_stu_score(score_file, new_score_file):
"""
读取score_file里的分数信息,根据总分从高到低排序,将排序后的信息输出到new_score_file文件中
:param score_file:
:param new_score_file:
:return:
"""
score_lst = []
with open(score_file, encoding="utf-8")as f:
for line in f:
score_lst.append(line.strip())
for index, item in enumerate(score_lst):
array = item.split(",")
score_sum = 0
for i in range(1, len(array)):
score_sum = int(array[i]) + score_sum
score_lst[index] = (item, score_sum)
score_lst.sort(key=lambda x:x[1], reverse=True)
with open(new_score_file, 'w', encoding="utf-8")as f:
for item in score_lst:
f.write(item[0] + "\n")
if __name__ == "__main__":
sort_stu_score("./data/score.txt", "./data/newscore.txt")
QQ交流群: 211426309