长度为n的布尔的pythonic随机列表,正好是k个Trues

时间:2014-04-16 06:03:16

标签: python list random

假设我们需要一个n 0 / 1个元素的列表,其中k1个实例。是否有一线理解或更多pythonic方式来做到这一点比以下?

def random_include(n, k):
    ret = []
    to_include = set(random.sample([i for i in range(n)], k))
    for i in range(n): 
        if i in to_include:
            ret.append(1)
        ret.append(0)

4 个答案:

答案 0 :(得分:7)

这是一个单线解决方案。

output = sorted([1] * k + [0] * (n - k), key=lambda k: random.random())

答案 1 :(得分:5)

使用random.shuffledocumentation):

random_list = [False] * j + [True] * k
random.shuffle(random_list)

将为您提供jFalsekTrue的随机列表。

请注意,实现自定义shuffle算法通常会产生问题,因为编写一个产生看似随机结果的算法非常容易,但不提供恒定的概率分布。即有些序列比其他序列更有可能!

Jeff Atwood's blog post中就此主题进行了广泛的探讨。正确的解决方案,如果你想要一个正确改组的序列,那就是使用Fisher-Yates algorithm,这正是random.shuffle()注意要做的事情:

def shuffle(self, x, random=None, int=int):
    randbelow = self._randbelow
    for i in reversed(range(1, len(x))):
        # pick an element in x[:i+1] with which to exchange x[i]
        j = randbelow(i+1) if random is None else int(random() * (i+1))
        x[i], x[j] = x[j], x[i]

因此,最好依靠random.shuffle()而不是想出一个聪明的方法来自己洗牌!

答案 2 :(得分:4)

def random_include(n, k):
    my_list = [1] * k + [0] * (n - k)
    random.shuffle(my_list)
    return my_list

首先使用足够的1和0构建列表。

my_list = [1] * k + [0] * (n - k)

然后洗牌

random.shuffle(my_list)

答案 3 :(得分:0)

尝试:

random.sample([1] * k + [0] * (n - k), n)

这会返回您想要的内容。