如何根据概率从列表中选择项目

时间:2018-07-14 08:46:59

标签: python python-3.x probability

我有列表ab

a = [0.1, 0.3, 0.1, 0.2, 0.1, 0.1, 0.1]

b = [apple, gun, pizza, sword, pasta, chicken, elephant]

现在我想创建一个由3个项目组成的新列表

根据列表a中的概率从列表b中选择3个项目

该项目不应在列表c中重复

例如-我正在寻找的输出

c = [gun,sword,pizza]

c = [apple, pizza, pasta]

注释 (列表a的所有值的总和为1,列表a和b中的项目数相同,实际上我在列表a和b中都有一千个项目,我想根据分配给的概率从列表中选择一百个项目他们,python3)

1 个答案:

答案 0 :(得分:4)

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