智能成绩表

题目描述

小明来到学校当老师, 需要将学生按考试总分或单科分数进行排名, 你能帮帮他吗?

输入描述

  • 第 1 行输入两个整数, 学生人数 n 和科目数量 m
    • 0 < n < 100
    • 0 < m < 10
  • 第 2 行输入 m 个科目名称, 彼此之间用空格隔开
    • 科目名称只由英文字母构成, 单个长度不超过10个字符
    • 科目的出现顺序和后续输入的学生成绩一一对应
    • 不会出现重复的科目名称
  • 第 3 行开始的 n 行, 每行包含一个学生的姓名和该生 m 个科目的成绩 (空格隔开)
    • 学生不会重名
    • 学生姓名只由英文字母构成, 长度不超过10个字符
    • 成绩是0~100的整数, 依次对应第2行种输入的科目
  • 第n+2行, 输入用作排名的科目名称. 若科目不存在, 则按总分进行排序

输出描述

输出一行, 按成绩排序后的学生名字, 空格隔开. 成绩相同的按照学生姓名字典顺序排序.

示例1

输入:

3 2
yuwen shuxue
fangfang 95 90
xiaohua 88 98
minmin 100 82
shuxue

输出:

xiaohua fangfang minmin

示例2

输入:

3 2
yuwen shuxue
fangfang 95 90
xiaohua 88 95
minmin 90 95
zongfen

输出:

fangfang minmin xiaohua

题解

Python

def main():
    # 读取输入
    parts = input().split()
    num_students = int(parts[0])
    num_courses = int(parts[1])
    course_list = list(input().split())
    students = []
    for i in range(num_students):
        part = input().split()
        name = part[0]
        individual_scores = list(map(int, part[1:]))
        assert len(individual_scores) == num_courses
        # 计算该学生的总分
        total_score = sum(individual_scores)
        students.append((name, individual_scores, total_score))

    sorted_by_course = input()
    # 分数要按照降序的方式来排序
    if sorted_by_course != "zongfen":
        # 如果指定的科目, 先找到它在分数列表中的索引位置, 再依此排序
        course_index = course_list.index(sorted_by_course)
        students.sort(key = lambda student: student[1][course_index], reverse = True)
    else:
        # 如果没有指定排序的科目, 就依总分来排序
        students.sort(key = lambda student: student[2], reverse = True)

    # 最后打印学生的名字
    print(" ".join(student[0] for student in students))

if __name__ == "__main__":
    main()