Как случайным образом выбирать значения для списка?

Я использую Python 2.7

Чтобы быть ясным, я не хочу рандомизировать элементы в списке. Я хочу сделать так, чтобы некоторые струны вообще не появлялись. Например:

    r = "red"
    b = "blue"
    y = "yellow"
    rc = random colour
    myColours = [rc,rc,rc]
    print myColours

Очевидно, что код выше не будет работать, но я не уверен, как продолжить. Это также помогло бы, если бы я мог изменить, насколько вероятна определенная строка, например, 50% шансов красного, 30% шансов синего и 20% шансов желтого.

Ответ 1

Вы можете использовать numpy.random.choice. Параметр p позволяет указать вероятности, связанные с каждой записью.

import numpy as np

r, b, y = 'red', 'blue', 'yellow'
my_colours = np.random.choice(a=[r, b, y], size=3, p=[.5, .3, .2])
print(my_colours) . # my_colours.tolist() if you want list output
# ['yellow' 'red' 'red']

Чтобы подтвердить, что это работает, используйте результат размером 30 000, а не 3, и пусть закон больших чисел сделает свое дело.

from collections import Counter

test = np.random.choice(a=[r, b, y], size=30000, p=[.5, .3, .2])
counts = Counter(test)

# Relative occurences:
dict(zip(counts.keys(), [count/30000 for count in counts.values()]))
{'blue': 0.30483333333333335,
 'red': 0.5000333333333333,
 'yellow': 0.19513333333333333}

Ответ 2

Хотя это не поможет OP, использующему Python 2.7, для тех, кто использует Python 3.6, random.choices прост, включает в себя вес и часть стандартной библиотеки.

Возвращает список элементов размера, выбранный из группы с заменой.

Учитывая

import random


r = "red"
b = "blue"
y = "yellow"

iterable = r, b, y
size = 3
wts = [.5, .3, .2]

код

random.choices(iterable, k=size)
# ['red', 'yellow', 'yellow']

random.choices(iterable, weights=wts, k=size)
# ['red', 'red', 'red']