题目:

批改多选题是比较麻烦的事情,有很多不同的计分方法。有一种最常见的计分方法是:如果考生选择了部分正确选项,并且没有选择任何错误选项,则得到 50% 分数;如果考生选择了任何一个错误的选项,则不能得分。本题就请你写个程序帮助老师批改多选题,并且指出哪道题的哪个选项错的人最多。
输入格式:
输入在第一行给出两个正整数 N(≤1000)和 M(≤100),分别是学生人数和多选题的个数。随后 M 行,每行顺次给出一道题的满分值(不超过 5 的正整数)、选项个数(不少于 2 且不超过 5 的正整数)、正确选项个数(不超过选项个数的正整数)、所有正确选项。注意每题的选项从小写英文字母 a 开始顺次排列。各项间以 1 个空格分隔。最后 N 行,每行给出一个学生的答题情况,其每题答案格式为 (选中的选项个数 选项1 ……),按题目顺序给出。注意:题目保证学生的答题情况是合法的,即不存在选中的选项数超过实际选项数的情况。
输出格式:
按照输入的顺序给出每个学生的得分,每个分数占一行,输出小数点后 1 位。最后输出错得最多的题目选项的信息,格式为:错误次数 题目编号(题目按照输入的顺序从1开始编号)-选项号。如果有并列,则每行一个选项,按题目编号递增顺序输出;再并列则按选项号递增顺序输出。行首尾不得有多余空格。如果所有题目都没有人错,则在最后一行输出 Too simple。
输入样例 1:
3 4
3 4 2 a c
2 5 1 b
5 3 2 b c
1 5 4 a b d e
(2 a c) (3 b d e) (2 a c) (3 a b e)
(2 a c) (1 b) (2 a b) (4 a b d e)
(2 b d) (1 e) (1 c) (4 a b c d)
输出样例 1:
3.5
6.0
2.5
2 2-e
2 3-a
2 3-b
输入样例 2:
2 2
3 4 2 a c
2 5 1 b
(2 a c) (1 b)
(2 a c) (1 b)
输出样例 2:
5.0
5.0
Too simple

思路:这个题目是目前花时间最长的一个题目,处理的细节需要把握,把详细注释都写在代码里了,代码的关键是把错误题号和错误选项 1-a 这种当成一个整体存入到一个字典的 key ,然后对应的 value 记录错误的次数。
然后此题和 1058 选择题 这个题的题目类似,可以结合梳理一下,链接
PAT乙级_1058 选择题 (20 分)_python

N, M = map(int, input().split())
score = []  # 记录所有题目分数
error_option = {
   }  # 记录题号、错误选项及错误次数的字典{'2-d': 1, ......}
right_answer = []  # 记录正确答案的列表

for i in range(M):
    lst = input().split()
    score.append(lst[0])  # score 存储每个题目分数
    T_answer = set(lst[3:])  # T_answer 单个题目正确答案
    right_answer.append(T_answer)

for i in range(N):
    answers = input()
    answers = answers.replace('(', '')
    # answers的格式:['2 a c', ' 3 b d e', ' 2 a c', ' 3 a b e', '']
    answers = answers.split(')')
    grade = 0  # 单个学生的得分
    for j in range(M):
        flag = 0
        # answer的格式:['2', 'a', 'c']
        answer = answers[j].strip().split()
        st_ans = set(answer[1:])  # st_ans表示学生答案
        # 直接判断学生的选项是否等于正确选项
        if st_ans == right_answer[j]:
            grade += float(score[j])
        else:
            # 选错的选项处理
            for s in st_ans:
                if s not in right_answer[j]:
                    # 这一步很关键,可以将每个题错误次数记录下来
                    o = str(j + 1) + '-' + s
                    try:
                        error_option[o] += 1
                    # 如果第一次出现在字典中,则加入该元素,并将value置为1
                    except:
                        error_option[o] = 1
                    flag += 1
            # 没有选的正确选项处理
            for s in right_answer[j]:
                if s not in st_ans:
                    o = str(j + 1) + '-' + s
                    try:
                        error_option[o] += 1
                    except:
                        error_option[o] = 1
            # 如果没有选错误答案(就是少选正确答案的情况)
            if flag == 0:
                grade += float(score[j]) * 0.5
    print('{:.1f}'.format(grade))

# 得到error_option格式为:{'2-d': 1, '2-e': 2, ......}
long = len(error_option)
if long == 0:
    print('Too simple')
else:
    max_error = max(error_option.values())
    result = []
    for k, v in error_option.items():
        if v == max_error:
            re = [v, k, int(k[0]), k[-1]]
            result.append(re)
    result.sort(key=lambda x: (x[2], x[3]))
    for r in result:
        print(r[0], r[1])