(Python)选修课

现有两门选修课,每门选修课都有一部分学生选修,每个学生都有选修课的成绩,
需要你找出同时选修了两门选修课的学生,先按照班级进行划分,班级编号小的先输出,
每个班级按照两门选修课成绩和的降序排序,成绩相同时按照学生的学号升序排序。
输入:
第一行为第一门选修课学生的成绩,第二行为第二门选修课学生的成绩,
每行数据中学生之间以英文分号分隔,每个学生的学号和成绩以英文逗号分隔,
学生学号的格式为 8 位数字(2 位院系编号+入学年份后 2 位+院系内部 1 位专业编号+所在班级 3 位学号),
学生成绩的取值范围为 [0,100] 之间的整数,两门选修课选修学生数的取值范围为 [1-2000] 之间的整数。
输出:
同时选修了两门选修课的学生的学号,如果没有同时选修两门选修课的学生输出 NULL,
否则,先按照班级划分,班级编号小的先输出,每个班级先输出班级编号(学号前五位),
然后另起一行输出这个班级同时选修两门选修课的学生学号,
学号按照要求排序(按照两门选修课成绩和的降序,成绩和相同时按照学号升序),学生之间以英文分号分隔。
输入1
01202021,75;01201033,95;01202008,80;01203006,90;01203088,100
01202008,70;01203088,85;01202111,80;01202021,75;01201100,88
输出1
01202
01202008;01202021
01203
01203088
说明1
同时选修了两门选修课的学生 01202021、01202008、01203088,
这三个学生两门选修课的成绩和分别为 150、150、185,01202021、01202008 属于 01202 班的学生,
按照成绩和降序,成绩相同时按学号升序输出的结果为 01202008;01202021,01203088 属于 01203 班的学生,
按照成绩和降序,成绩相同时按学号升序输出的结果为 01203088,01202 的班级编号小于 01203 的班级编号,需要先输出。
输入2
01201022,75;01202033,95;01202018,80;01203006,90;01202066,100
01202008,70;01203102,85;01202111,80;01201021,75;01201100,88
输出2
NULL
说明2
没有同时选修了两门选修课的学生
01202021
01院系编号 20年份 2专业编号 021学号
01202班级编号
score1 = input().split(";")
score2 = input().split(";")
dict1 = {i.split(",")[0]: i.split(",")[1] for i in score1}
dict2 = {i.split(",")[0]: i.split(",")[1] for i in score2}
res_list = []
for k1 in dict1.keys():
    for k2 in dict2.keys():
        if k1 == k2:
            score_sum = int(dict1[k1]) + int(dict2[k2])
            res_list.append({"学号": k1, "成绩和": score_sum})
if len(res_list) == 0:
    print("NULL")
else:
    res_dict = {}
    res_list = sorted(sorted(res_list, key=lambda x: x["学号"][:5]), key=lambda x: x["成绩和"])
    print(res_list)
    for i in res_list:
        if i["学号"][:5] in res_dict:
            res_dict[i["学号"][:5]] += ";" + i["学号"]
        else:
            res_dict[i["学号"][:5]] = i["学号"]

    print(res_dict)
    for k,v in res_dict.items():
        print(k)
        print(v)

猜你喜欢

转载自blog.csdn.net/qq_43486538/article/details/133820191