关于python:如何随机选择列表的值?

How to randomly select values for a list?

我用的是python 2.7

明确地说,我不想随机化列表中的项目。我想让它,这样某些弦就有可能根本不出现。例如:

1
2
3
4
5
6
    r ="red"
    b ="blue"
    y ="yellow"
    rc = random colour
    myColours = [rc,rc,rc]
    print myColours

显然上面的代码不起作用,但我不确定如何继续。如果我能改变选择某个字符串的可能性,比如50%的几率是红色,30%的几率是蓝色,20%的几率是黄色,这也会有所帮助。


您可以使用numpy.random.choicep参数允许您指定与每个条目相关的概率。

1
2
3
4
5
6
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']

要确认这是有效的,使用大小为30000而不是3的结果,并让大数定律来做它的事情。

1
2
3
4
5
6
7
8
9
10
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}

虽然这对使用python 2.7的操作没有帮助,但是对于使用python 3.6的操作来说,random.choices很简单,包含了权重,并且是标准库的一部分。

Return a k sized list of elements chosen from the population with replacement.

鉴于

1
2
3
4
5
6
7
8
9
10
import random


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

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

代码

1
2
3
4
5
random.choices(iterable, k=size)
# ['red', 'yellow', 'yellow']

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