如何根据用户输入的属性值筛选测试题类对象并随机抽取打印?
解决方案
直接在现有代码基础上扩展即可实现需求,步骤如下:
1. 补充导入必要模块
需要添加random模块用于随机抽取题目:
import random
2. 实现核心功能逻辑
编写函数处理用户输入、题目筛选、随机抽取和内容打印:
def generate_test(): # 获取用户输入的测试类别和题目数量 test_name = input("请输入测试类别(如Math):") try: question_count = int(input("请输入题目数量:")) except ValueError: print("题目数量必须是整数,请重新输入") return # 筛选出对应类别的题目 filtered_questions = [q for q in question_instances if q.Relevance == test_name] # 校验题目数量是否充足 if len(filtered_questions) == 0: print(f"未找到类别为{test_name}的题目") return if len(filtered_questions) < question_count: print(f"该类别仅包含{len(filtered_questions)}道题目,无法抽取{question_count}道") return # 随机抽取指定数量的题目(避免重复抽取) selected_questions = random.sample(filtered_questions, question_count) # 打印题目内容(排除Relevance属性) for idx, q in enumerate(selected_questions, 1): print(f"\n=== 第{idx}题 ===") # 手动指定属性打印,格式更规整 print(f"题目:{q.Question}") print(f"任务:{q.task}") print(f"参考:{q.reference}") print(f"A选项:{q.aAnswer}") print(f"B选项:{q.bAnswer}") print(f"C选项:{q.cAnswer}") print(f"D选项:{q.dAnswer}") print(f"正确答案:{q.letterAnswer}")
如果Question类的属性较多,也可以用遍历对象属性的方式简化打印逻辑:
# 简化版打印逻辑 for idx, q in enumerate(selected_questions, 1): print(f"\n=== 第{idx}题 ===") for attr_name, attr_value in q.__dict__.items(): if attr_name != 'Relevance': print(f"{attr_name}:{attr_value}")
3. 调用函数执行
在现有代码末尾添加调用语句:
if __name__ == "__main__": generate_test()
关键逻辑说明
- 用列表推导式快速过滤匹配
Relevance属性的题目,效率较高 - 使用
random.sample()而非random.choice(),确保不会重复抽取同一道题 - 添加了输入校验,处理用户输入非整数、无匹配题目、数量不足等异常情况
内容的提问来源于stack exchange,提问作者ATCEO
相关产品推荐
相关产品推荐

