Python获取两随机采样列表所有符合规则的阵容组合方法
核心问题
你现有代码的逻辑存在3个本质错误,根本无法生成全量符合要求的阵容:
- 误用
random.sample:这个函数的作用是随机抽样,每次调用都会随机选出对应数量的元素,完全不会遍历全量选手。你在循环里反复调用它,每次拿到的都是零散的随机样本,和枚举全组合的需求完全相悖 - 组合函数用法错误:你每次先凑出一个6人临时列表,再对这个长度为6的列表调用
combinations(lst,6),长度为n的列表取n个元素的组合永远只有1种,根本不可能生成多套阵容 - 循环逻辑无意义:你拿单次随机抽样得到的组合长度当range参数,循环里又重复做随机抽样+生成组合的操作,最后lineup里存的只是若干次随机凑出来的单组阵容,和你要的全量合规结果没有关系
正确实现代码
你的需求是枚举所有「2名10k档选手+4名7k档选手」的6人阵容,不需要随机抽样,直接用组合枚举+笛卡尔积拼接即可,代码如下:
import csv from itertools import combinations tenKRange = [] sevenKRange = [] lineup = [] # 读取csv文件,按薪资档位存储选手 with open('combinations.csv', 'r') as file: reader = csv.reader(file) for row in reader: salary = int(row[1]) if salary >= 10000: tenKRange.append(row) elif 7000 <= salary < 8000: sevenKRange.append(row) # 分别枚举两类档位的合规人数组合,拼接得到所有满足要求的阵容 for ten_k_pair in combinations(tenKRange, 2): for seven_k_quad in combinations(sevenKRange, 4): lineup.append(list(ten_k_pair) + list(seven_k_quad))
注意事项
注意:如果两个档位的选手基数较大,全量组合的体量会非常夸张——比如10k档有50人、7k档有100人的时候,总组合数能到48亿级别,全塞进列表里内存会直接溢出。这种场景建议提前加筛选规则(比如选手近期战绩阈值、同队人数限制之类的)边生成边过滤,或者用生成器按需取阵容,不要一次性把所有结果都加载到内存里。
内容的提问来源于stack exchange,提问作者BruceyBandit
相关产品推荐
相关产品推荐

