如何在Python quiz程序中实现问题与多选题正确答案的映射
问题根因
校验逻辑误用了全局正确答案列表做匹配:你在quiz循环中已经通过zip取出了当前题目对应的正确答案到变量correct_choice,但判断时写的是user_answer in correct_answer,这里的correct_answer是存储了所有题目正确答案的全局列表,只要用户输入内容是任意一道题的正确答案就会判定为正确,自然无法和当前题目做绑定。
快速修复方案
仅修改1行代码即可解决当前问题,为了提升容错性还可以加大小写和空格兼容处理:
把quiz逻辑段中的判断语句
if user_answer in correct_answer:
替换为:
# 去除用户输入前后空格,统一转大写后和当前题的正确答案比对 if user_answer.strip().upper() == correct_choice.strip().upper():
更优的映射优化方案
当前用三个独立列表存储题目、选项、答案的方式很容易出现长度不一致导致的对应关系错位,建议直接把单题所有信息封装后存在同一个列表,天然实现题目和对应答案的绑定:
- 替换原来的三个全局列表为单个题库列表
# 替换原question_list、option_list、correct_answer三个空列表 question_bank = []
- 新增题目时存储为单题字典
for x in range(b): question = input('Enter your question:') o = input('Option A:') p = input('Option B:') m = input('Option C:') r = input('Option D:') choices = 'A):{}\nB):{}\nC):{}\nD):{}'.format(o, p, m, r) correct = input('Put your answer here:') # 单题所有信息绑定存储 question_bank.append({ "question": question, "choices": choices, "correct": correct })
- 测验逻辑直接遍历题库,不需要zip多个列表
for single_q in question_bank: print(single_q["question"]) print(single_q["choices"]) user_answer = input('Enter your answer here:').strip().upper() if user_answer == single_q["correct"].strip().upper(): print("Correct") score += 1 else: print('False Answer') # 得分计算逻辑保持不变即可
额外优化提示:原代码使用递归调用
main_content()实现菜单循环,长时间使用会触发Python递归栈溢出,建议把菜单逻辑包裹在while True循环中,不需要递归调用自身,选择退出时直接break跳出循环即可。
内容的提问来源于stack exchange,提问作者Aditya Acharya
相关产品推荐
相关产品推荐

