You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何优化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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 22:47:33