Python使用random模块按约束条件处理嵌套列表生成目标结果
实现思路
原有代码存在两个核心问题:
- 抽样时没有保留强制必选的条目,会出现必选项漏选的情况
- 抽样后做了强制升序排序,和要求的随机顺序输出不符
正确的处理流程对每一组配对的a、b子列表按如下规则处理:
- 读取当前组需要选取的总条目数,以及必须包含的条目列表
- 生成当前组的全量可选条目池:范围是1到b子列表给出的最大编号
- 计算除了必选条目外,还需要随机抽取的条目数量
- 从「可选池排除必选条目」的剩余集合中,无放回抽取对应数量的补充条目
- 将必选条目和补充条目合并后随机打乱顺序,作为结果列表c的对应子项
可运行代码
import random a = [[3, 1], [3, 2, 3], [5, 1, 4, 8], [3, 5], [10, 1, 3, 6, 7], [2, 1, 2]] b = [[4], [3], [9], [5], [21], [5]] c = [] for a_item, b_item in zip(a, b): total_pick = a_item[0] required_items = a_item[1:] required_set = set(required_items) max_entry = b_item[0] # 生成全量可选池 full_pool = set(range(1, max_entry + 1)) # 计算需要额外抽取的条目数 extra_num = total_pick - len(required_set) # 从非必选项中抽样 optional_candidates = list(full_pool - required_set) extra_items = random.sample(optional_candidates, extra_num) # 合并后打乱顺序 current_res = required_items + extra_items random.shuffle(current_res) c.append(current_res) print(c)
效果说明
代码运行后输出的结果完全符合规则:
- 每个子列表长度和a对应位置要求的总选取数一致
- a中指定的必选条目100%会出现在对应子结果中
- 所有条目都在1到b对应位置指定的最大编号范围内
- 结果顺序随机,不会强制升序排列,和给出的参考输出格式匹配。如果固定随机种子,可以完全复现参考输出的结果。
内容的提问来源于stack exchange,提问作者Alan Jones
相关产品推荐
相关产品推荐

