如何用Python的random.sample从范围中抽取排除指定值的样本?
解决方法
方法1:先构建排除后的候选集合再抽样
先把需要排除的元素转成集合(集合的成员检查效率远高于列表),过滤原群体后再抽样,逻辑直观且适用于大多数场景。
import random exclude = {122, 506, 1100, 56, 76, 1301} # 转集合提升检查速度 n = range(1, 1501) # 过滤排除项,生成候选池 candidates = [num for num in n if num not in exclude] # 从候选池中抽取500个样本 result = random.sample(candidates, 500) print(result)
特点:逻辑清晰,一次过滤后直接完成抽样,候选池可复用;但原群体极大时,生成完整候选池会占用较多内存。
方法2:拒绝抽样(适合排除项较少的场景)
若排除元素数量少,无需提前生成完整候选池,通过循环随机生成元素并跳过排除项,直到收集足够样本,能节省内存。
import random exclude = {122, 506, 1100, 56, 76, 1301} sample_size = 500 result = set() while len(result) < sample_size: num = random.randint(1, 1500) if num not in exclude: result.add(num) # 按需转成列表 result = list(result) print(result)
特点:内存占用低,排除项越少效率越高;但排除项占比高时,循环次数会大幅增加,效率下降。
关键提示
务必将exclude转为集合(set),列表的in操作是O(n)时间复杂度,而集合是O(1),能大幅提升检查速度。
内容的提问来源于stack exchange,提问作者Rémi Gate
相关产品推荐
相关产品推荐

