如何在Python中按指定比例获取列表的随机子列表?
实现按比例抽取列表随机子列表
现有列表:
l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
我们需要获取该列表的随机比例子列表,即长度为len(l) * frac的随机子列表。例如当frac=0.2时,输出列表长度应为2(0.2×10)。预期效果如下:
l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] l_new = sample(list=l, frac=0.3) # [4, 6, 8] l_new = sample(list=l, frac=0.6) # [0, 1, 4, 6, 7, 8]
已知random.sample函数需要指定元素数量而非比例,请问如何实现上述功能?
实现方案
你可以自己封装一个sample函数,核心逻辑是先根据比例计算抽取数量,再调用random.sample完成随机抽取。同时要处理极端情况,避免抽取数量异常。
代码示例
import random def sample(lst, frac): # 按比例计算抽取数量,用round()做四舍五入处理 sample_size = round(len(lst) * frac) # 限制抽取数量在合理范围,防止frac超出0-1导致报错 sample_size = max(0, min(sample_size, len(lst))) return random.sample(lst, sample_size) # 测试使用 l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] print(sample(l, 0.3)) # 输出类似 [4,6,8] 的长度为3的随机子列表 print(sample(l, 0.6)) # 输出类似 [0,1,4,6,7,8] 的长度为6的随机子列表
补充说明
- 如果需要严格向下取整(比如
frac=0.3时直接取3,不做四舍五入),可以把round()换成int():sample_size = int(len(lst) * frac) max(0, min(sample_size, len(lst)))的作用是防止传入的frac小于0或大于1时,出现抽取数量为负或者超过列表长度的报错。
内容的提问来源于stack exchange,提问作者Janikas
相关产品推荐
相关产品推荐

