Python 如何根据概率从列表中选择项目
我有Python 如何根据概率从列表中选择项目,python,python-3.x,probability,Python,Python 3.x,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 根据列表a中的概率从列表b中选择这3项 列表c中的项目不应重复 例如,我正在寻找的输出 c = [gun,sword,pizza] 或 注意 (列表a的所有值之和为1,列表a和b中的项目数相同,实际上我在列表a和b中都有1000个项目,我想根据分配给它
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
根据列表a中的概率从列表b中选择这3项
列表c中的项目不应重复
例如,我正在寻找的输出
c = [gun,sword,pizza]
或
注意
(列表a的所有值之和为1,列表a和b中的项目数相同,实际上我在列表a和b中都有1000个项目,我想根据分配给它们的概率从列表中选择100个项目,python3)使用
随机。选择
:
>>> 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']
如果你对numpy持开放态度,那么答案很简单。是吗?另外,我不确定这与遗传算法或模糊模糊性有什么关系,所以我要删除那些标签。是的,对Numpy开放。我不确定你需要Numpy,只是。@Delgan文档建议它使用替换,但似乎没有理由避免它?文档表明这是用替换选择的,我看不到避免的方法。@roganjosh添加了一种方法,我认为使用numpy方法更容易:)我的“看不到避免的方法”更多是指
选择
没有阻止替换的参数。它似乎比numpy方法落后了一些,但它正在实现:)也许Python3.8会修复它。
>>> 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']