Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何根据概率从列表中选择项目_Python_Python 3.x_Probability - Fatal编程技术网

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']