1073. 多选题常见计分法(20)——python

刚开始写的那个逻辑有点混乱,只通过了三个测试点,所以今天索性又重新写了一个,这次更加的注重逻辑的实现,主要的就是使用了两个字典,一个是dir_count_wrong,用来保存每个题错误选项的次数,还有一个就是dir_list_wrong,是用来保存每个题的错误选项。

(1)首先是对正确选项以及同学的答案进行处理,放到字典中;

(2)对每一个同学的选择题进行分析,分为三种情况,全对,部分对以及答案错误,并且算出该同学的得分;

(3)在将同学的答题情况分为三种后,就可以分别进行统计, 全对时不用考虑,然后就是考虑部分对以及答案错误的情况;

(4)对每个同学的每个选项进行分析,若是错误的(这个错误包括漏选以及多选),则将该题的选项保存到该题的dir_list_wrong字典中,这个字典中的值就是错误选项的list,主要的作用就是判断该题的该选项是否是第一次出错;然后再根据是否是第一次出错,对保存选项次数的dir_count_wrong进行操作;

(5)之后就是统计出错的最多的选项,然后输出相应的格式。

def get_input(M, dir_right_answers, list_grades):
	#得到所有标准答案并存放在字典中, 并返回分数list	
	for i in range(M):
		string_right = input()
		dir_right_answers[i] = string_right
		list_grades.append(int(string_right[0]))
		
def deal_my_answer(string_my_answer):
	#对学生的答案进行处理,得到标准的list
	string_my_answer = string_my_answer[1:-1]
	string_my_answer = string_my_answer.split(') (')
	return string_my_answer
	
def judge_wrong_or_partRight(my_answer, right_answer):
	#一个同学的某个答案在没有全对的情况下判断是属于全错还是部分对的情况
	wrong_flag = False
	for num in my_answer:
		if num not in right_answer:
			wrong_flag = True
	return wrong_flag

def get_part_right_per_count(right_answer, my_answer, list_wrong, count_per):
	#得到部分正确选项的遗漏选项次数
	for num in right_answer:
		if num not in my_answer:
			if num not in list_wrong:
				list_wrong.append(num) #从来没有的加入到错误选项list
				count_per[num] = 1
			else:
				count_per[num] += 1
				
def get_wrong_count(right_answer, my_answer, list_wrong, count_per):
	#得到错误答案选项中的次数
	right_answer_copy = right_answer
	#my_answer_copy = my_answer
	for num in my_answer:
		if num in right_answer:
			right_answer_copy.remove(num)
		elif num not in list_wrong:
			list_wrong.append(num)
			count_per[num] = 1
		else:
			count_per[num] += 1
	if right_answer_copy:
		for num in right_answer_copy:
			if num not in list_wrong:
				list_wrong.append(num) #从来没有的加入到错误选项list
				count_per[num] = 1
			else:
				count_per[num] += 1			
			
def judge_my_answer(M, string_my_answer, dir_right_answers, list_grades, dir_count_wrong, dir_list_wrong,
		flag_wrong):
	#判断一个同学的答案是否正确, 并且得到其本道题的分数
	my_grades = 0
	for i in range(M):
		wrong_flag = False
		right_answer = dir_right_answers[i].split()
		right_answer = right_answer[3:] #得到只含选项的正确答案
		my_answer = string_my_answer[i].split()
		my_answer = my_answer[1:] #得到只含选项的同学所做答案
		if my_answer == right_answer:
			my_grades += list_grades[i] #全对的情况
			#print("OK")
		else: #其他的情况
			flag_wrong = True
			wrong_flag = judge_wrong_or_partRight(my_answer, right_answer)
			if wrong_flag:
				#pass
				get_wrong_count(right_answer, my_answer, dir_list_wrong[i], dir_count_wrong[i])
				#print("NO")
			else:
				my_grades += list_grades[i] * 0.5				
				get_part_right_per_count(right_answer, my_answer, dir_list_wrong[i], dir_count_wrong[i])
	print("%.1f" % my_grades)
	return flag_wrong

def get_initilazition_list(M, dir_list_wrong, dir_count_wrong):
	#初始化存放错误选项的list以及存放错误次数的字典
	for i in range(M):
		dir_list_wrong[i] = []
		dir_count_wrong[i] = {}

def get_max_count(M, dir_count_wrong, dir_list_wrong):
	#寻找错误次数最多的选项
	dir_max = {}
	max_all = 0
	list_count_all = []
	for i in range(M):
		list_count = []
		my_dir = dir_count_wrong[i]
		for num in dir_list_wrong[i]:
			list_count.append(my_dir[num])
		dir_max[i] = max(list_count)
		list_count_all.append(dir_max[i])
	max_all = max(list_count_all)
	
	#列出所有的错误次数最多的选项
	for i in range(M):
		if dir_max[i] == max_all:
			my_wrong_list = dir_list_wrong[i]
			my_wrong_list = sorted(my_wrong_list)
			for num in my_wrong_list:
				if dir_count_wrong[i][num] == max_all:
					print("%d %d-%s" % (max_all, i + 1, num))
		
if __name__ == '__main__':
	string_N_AND_M = input().split()
	N, M = int(string_N_AND_M[0]), int(string_N_AND_M[1])
	dir_right_answers = {} #存放正确答案的字典
	flag_wrong = False #标识是否有错误答案
	dir_count_wrong = {} #存放每个题所有错误答案次数的字典
	
	dir_list_wrong = {} #存放每一题错误选项list的字典
	get_initilazition_list(M, dir_list_wrong, dir_count_wrong)
	
	list_grades = [] #存放每个题分数的list
	get_input(M, dir_right_answers, list_grades)
	#print(list_grades)
	for i in range(N): #对每一个同学的情况进行分析
		string_my_answer = input()
		string_my_answer = deal_my_answer(string_my_answer)
		flag_wrong = judge_my_answer(M, string_my_answer, dir_right_answers, list_grades,
			dir_count_wrong, dir_list_wrong, flag_wrong)
	#print(dir_count_wrong)
	#print(dir_list_wrong)
	if flag_wrong:
		get_max_count(M, dir_count_wrong, dir_list_wrong)
	else:
		print("Too simple")
	

猜你喜欢

转载自blog.csdn.net/baidu_38271024/article/details/79485723