学生成绩排序

1. 实战目标

下面一份学习成绩单,保存在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:
    """

2. 考察知识点

  1. 文件读写
  2. 列表的运用
  3. 列表排序
  4. for循环

3. 思路讲解与实现

3.1 读取score.txt数据

    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中

3.2 对学生成绩排序

需要计算学生的总成绩,而列表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 表示倒序,这样就实现了从大到小的排序。

3.3 写入新文件

    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

4. 完整代码

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

加入知识星球, 每天收获更多精彩内容

分享日常研究的python技术和遇到的问题及解决方案