创建随机 0 和 1 列表的优雅方式

Dan*_*ain 2 python random list-comprehension

model = [random.randint(0,1) if model.count(0) < 20 else 1 for _ in range(40)]

当然model.count(0)是错误的。在这里我们寻找正确的代码,但没有列表理解。

model = list()
for i in range(40):
   if model.count(0) < 20:
       model.append(random.randint(0,1))
   else:
       model.append(1)
Run Code Online (Sandbox Code Playgroud)

我只是喜欢列表理解,它让我更容易使用 NLP 和大量的工作。所以找到新功能会很酷。

Moi*_*dri 5

List Comprehension很好,但并不适合所有场景。在您的情况下,编写显式for循环更有意义。

但是,您可以使用random.shuffle以更有效地获得类似的结果。如果您同时需要0并且1在结果列表中计数为 20,您可以执行以下操作:

>>> import random
>>> my_list = [0]*20 + [1]*20

>>> random.shuffle(my_list)
>>> my_list
[0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0]
Run Code Online (Sandbox Code Playgroud)

但是,如果您希望的计数0在 0-20 之间是随机的(您当前的代码正在这样做),那么您可以将上述逻辑修改为:

>>> zero_count = random.randint(0, 20)
>>> one_count = 40 - zero_count

>>> my_list = [0]*zero_count + [1]*one_count
>>> random.shuffle(my_list)
>>> my_list
[1, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1]
Run Code Online (Sandbox Code Playgroud)