如何优化Python代码实现嵌套列表的指定类型题目动态抽取
嵌套列表下的题目批量抽取实现
核心思路拆成两步:先把每组题目按类型整理成可抽取的池子,再按对应组的需求随机抽取指定数量的题目。
步骤1:将题目集合按类型分组
先写个辅助函数,把每组的题目(每两个元素为一道题)按1*、2*、3*类型分类存储,方便后续抽取:
import random def group_questions_by_type(question_group): # 把连续两个元素打包成一道完整题目 full_questions = [question_group[i:i+2] for i in range(0, len(question_group), 2)] type_pools = {'1*': [], '2*': [], '3*': []} for q_pair in full_questions: # 从题目头提取类型(比如从'Q1:1*'里拿到'1*') q_type = q_pair[0].split(':')[-1].strip() if q_type in type_pools: type_pools[q_type].append(q_pair) return type_pools
步骤2:按嵌套需求批量抽取题目
主逻辑同时遍历需求组和题目组,对每组先整理类型池,再按需求抽题,最后还原成原列表格式:
def extract_questions_by_nested_demands(demand_list, question_list): # 先校验需求组和题目组数量是否匹配 if len(demand_list) != len(question_list): raise ValueError("需求组数量和题目组数量不匹配") all_extracted_groups = [] for demands, questions in zip(demand_list, question_list): type_pools = group_questions_by_type(questions) count_1star, count_2star, count_3star = demands extracted_pairs = [] # 按需求抽取对应类型题目,用sample避免重复抽同一题 if count_1star > 0: extracted_pairs.extend(random.sample(type_pools['1*'], min(count_1star, len(type_pools['1*'])))) if count_2star > 0: extracted_pairs.extend(random.sample(type_pools['2*'], min(count_2star, len(type_pools['2*'])))) if count_3star > 0: extracted_pairs.extend(random.sample(type_pools['3*'], min(count_3star, len(type_pools['3*'])))) # 把抽取的题目对展平成原格式的列表 flattened_group = [item for pair in extracted_pairs for item in pair] all_extracted_groups.append(flattened_group) return all_extracted_groups
测试示例
用下面的测试数据验证功能:
# 嵌套需求列表:每组[1*数量, 2*数量, 3*数量] list_a = [ [1, 1, 0], # 第一组抽1道1*、1道2* [0, 2, 1] # 第二组抽2道2*、1道3* ] # 嵌套题目列表:每组是成对的题目元素 list_b = [ ['Q1:1*', 'Q1 is type 1*', 'Q2:2*', 'Q2 is type 2*', 'Q3:1*', 'Q3 is type 1*', 'Q4:2*', 'Q4 is type 2*'], ['Q5:2*', 'Q5 is type 2*', 'Q6:3*', 'Q6 is type 3*', 'Q7:2*', 'Q7 is type 2*', 'Q8:3*', 'Q8 is type 3*'] ] # 执行抽取 result = extract_questions_by_nested_demands(list_a, list_b) for idx, group in enumerate(result): print(f"第{idx+1}组抽取结果:") print(group)
关键细节
- 用
random.sample而非random.choice,确保不会重复抽取同一道题 - 加了
min(count, len(pool))判断,避免需求数量超过该类型题目总数时出错 - 提前校验需求组和题目组的数量一致性,避免逻辑混乱
内容的提问来源于stack exchange,提问作者Alan Jones
相关产品推荐
相关产品推荐

