如何根据概率 select 列表中的项目
How to select items from a list based on probability
我有列表 a
和 b
a = [0.1, 0.3, 0.1, 0.2, 0.1, 0.1, 0.1]
b = [apple, gun, pizza, sword, pasta, chicken, elephant]
现在我想创建一个包含 3 个项目的新列表 c
这 3 个项目是根据列表 a 中的概率从列表 b 中选择的
项目不应在列表 c 中重复
例如-我正在寻找的输出
c = [gun,sword,pizza]
或
c = [apple, pizza, pasta]
注意
(列表 a 的所有值的总和为 1,列表 a 和 b 中的项目数相同,实际上我在列表 a 和 b 中都有一千个项目,我想 select 列表中的一百个项目基于根据分配给他们的概率,python3 )
使用random.choices
:
>>> import random
>>> print(random.choices(
... ['apple', 'gun', 'pizza', 'sword', 'pasta', 'chicken', 'elephant'],
... [0.1, 0.3, 0.1, 0.2, 0.1, 0.1, 0.1],
... k=3
... ))
['gun', 'pasta', 'sword']
编辑:为避免替换,您可以从总体中删除所选项目:
def choices_no_replacement(population, weights, k=1):
population = list(population)
weigths = list(weights)
result = []
for n in range(k):
pos = random.choices(
range(len(population)),
weights,
k=1
)[0]
result.append(population[pos])
del population[pos], weights[pos]
return result
测试:
>>> print(choices_no_replacement(
... ['apple', 'gun', 'pizza', 'sword', 'pasta', 'chicken', 'elephant'],
... [0.1, 0.3, 0.1, 0.2, 0.1, 0.1, 0.1],
... k=3
... ))
['gun', 'pizza', 'sword']
如果您不想提前定义要选择的物品数量(因此,您不会做 k=3
之类的事情)并且您只有概率,您可以按照以下步骤操作.请注意,您的概率不需要如图所示加起来为 1,它们可以相互独立。不可否认,我不是在解决您防止可能重复的问题:
a = [0.2, 0.3, 0.9, 0.1]
b = ['apple', 'gun', 'pizza', 'sword']
selected_items = [item for p,item in zip(a,b) if random.random()<p]
print(selected_items)
>>>['apple','pizza']
我有列表 a
和 b
a = [0.1, 0.3, 0.1, 0.2, 0.1, 0.1, 0.1]
b = [apple, gun, pizza, sword, pasta, chicken, elephant]
现在我想创建一个包含 3 个项目的新列表 c
这 3 个项目是根据列表 a 中的概率从列表 b 中选择的
项目不应在列表 c 中重复
例如-我正在寻找的输出
c = [gun,sword,pizza]
或
c = [apple, pizza, pasta]
注意 (列表 a 的所有值的总和为 1,列表 a 和 b 中的项目数相同,实际上我在列表 a 和 b 中都有一千个项目,我想 select 列表中的一百个项目基于根据分配给他们的概率,python3 )
使用random.choices
:
>>> import random
>>> print(random.choices(
... ['apple', 'gun', 'pizza', 'sword', 'pasta', 'chicken', 'elephant'],
... [0.1, 0.3, 0.1, 0.2, 0.1, 0.1, 0.1],
... k=3
... ))
['gun', 'pasta', 'sword']
编辑:为避免替换,您可以从总体中删除所选项目:
def choices_no_replacement(population, weights, k=1):
population = list(population)
weigths = list(weights)
result = []
for n in range(k):
pos = random.choices(
range(len(population)),
weights,
k=1
)[0]
result.append(population[pos])
del population[pos], weights[pos]
return result
测试:
>>> print(choices_no_replacement(
... ['apple', 'gun', 'pizza', 'sword', 'pasta', 'chicken', 'elephant'],
... [0.1, 0.3, 0.1, 0.2, 0.1, 0.1, 0.1],
... k=3
... ))
['gun', 'pizza', 'sword']
如果您不想提前定义要选择的物品数量(因此,您不会做 k=3
之类的事情)并且您只有概率,您可以按照以下步骤操作.请注意,您的概率不需要如图所示加起来为 1,它们可以相互独立。不可否认,我不是在解决您防止可能重复的问题:
a = [0.2, 0.3, 0.9, 0.1]
b = ['apple', 'gun', 'pizza', 'sword']
selected_items = [item for p,item in zip(a,b) if random.random()<p]
print(selected_items)
>>>['apple','pizza']