python - 从具有不同列表长度的列表中获取加权随机值
问题描述
我需要创建一个新列表,其中包含从列表列表中提取的随机值,其中辅助列表可能具有不同的长度。
另外,我需要考虑到,例如,如果二级列表之一大于其余列表,则从所述列表中获取值的概率必须高于较短二级列表的概率。随机值可能会被多次选择,这意味着我不必在被选择后将其从列表列表中删除。
我能够创建列表列表,其中每个二级列表对应一个区域,其内容对应于随机生成的客户端代码,到目前为止一切都很好。但是,当我使用函数 random.choice() 创建具有随机值的新列表时,我会从可用列表中获得 x 数量的随机列表,而不是从所有列表中选择的随机值。
thislist = []
# So I have my blank list and I am ready to populate the list with,
# in this case, 10 random values from the list of lists named 'codigo_cliente'
for i in range(10):
thislist.append(random.choice(codigo_cliente))
以下是此示例中共有 30 个客户端的客户端代码:
客户代码:
[['A-336', 'A-437', 'A-720', 'A-233', 'A-499'],
['B-664', 'B-133', 'B-267', 'B-421', 'B-553', 'B-910', 'B-792', 'B-719', 'B-550', 'B-946'],
['C-755', 'C-533', 'C-596', 'C-877', 'C-400', 'C-354', 'C-471', 'C-169', 'C-329', 'C-318', 'C-550', 'C-422', 'C-251', 'C-852', 'C-309']]
我得到以下输出,这不是我想要的:
这是随机选择的客户列表:
[['B-664', 'B-133', 'B-267', 'B-421', 'B-553', 'B-910', 'B-792', 'B-719', 'B-550', 'B-946'],
['A-336', 'A-437', 'A-720', 'A-233', 'A-499'],
['C-755', 'C-533', 'C-596', 'C-877', 'C-400', 'C-354', 'C-471', 'C-169', 'C-329', 'C-318', 'C-550', 'C-422', 'C-251', 'C-852', 'C-309'],
['A-336', 'A-437', 'A-720', 'A-233', 'A-499'],
['B-664', 'B-133', 'B-267', 'B-421', 'B-553', 'B-910', 'B-792', 'B-719', 'B-550', 'B-946'],
['C-755', 'C-533', 'C-596', 'C-877', 'C-400', 'C-354', 'C-471', 'C-169', 'C-329', 'C-318', 'C-550', 'C-422', 'C-251', 'C-852', 'C-309'],
['C-755', 'C-533', 'C-596', 'C-877', 'C-400', 'C-354', 'C-471', 'C-169', 'C-329', 'C-318', 'C-550', 'C-422', 'C-251', 'C-852', 'C-309'],
['C-755', 'C-533', 'C-596', 'C-877', 'C-400', 'C-354', 'C-471', 'C-169', 'C-329', 'C-318', 'C-550', 'C-422', 'C-251', 'C-852', 'C-309'],
['B-664', 'B-133', 'B-267', 'B-421', 'B-553', 'B-910', 'B-792', 'B-719', 'B-550', 'B-946'],
['A-336', 'A-437', 'A-720', 'A-233', 'A-499']]
相反,我应该得到类似的东西,例如,以下内容:
thislist = ['A-336', 'B-553', 'C-596', 'B-910', 'C-251', 'C-329', 'B-910', 'A-437', 'B-946', 'C-251']
# Notice how there are more values with the "C" prefix from the larger secondary list,
# than values with the A or B prefixes from the smaller secondary lists.
解决方案
random.choices()
与weights
设置为列表长度的参数一起使用。这会根据列表的长度按比例选择列表。然后用于random.choice()
从每个列表中选择一个元素。 k
是要选择的项目数:
from random import choice, choices
w = [len(d) for d in codigo_cliente]
[choice(lst) for lst in choices(codigo_cliente, weights=w, k=10)]
样本输出:
['C-400', 'C-596', 'B-553', 'C-471', 'B-133',
'C-596', 'B-133', 'A-499', 'C-471', 'C-400']
推荐阅读
- laravel-5 - 规划一个 laravel 应用程序 - MVC 灾难
- r - 在 r 中调整 grob 对象的边距
- node.js - 将 .inv 添加到 req,session 后网站超时
- python - 恢复 pytorch 模型训练会引发错误“CUDA out of memory”
- sql - 来自查询的 Oracle SQL 过滤结果
- python - 在python中为类创建链方法
- php - 使用 foreach php 组合并构建数组
- c - 在没有 sizeof() 的情况下计算 int 中有多少位
- c# - 按钮在预览中未显示在运行中
- php - 如何在数组的开头和结尾添加html