【问题标题】:Create lists with different amounts of random numbers创建具有不同数量随机数的列表
【发布时间】:2018-09-10 13:04:29
【问题描述】:

我需要创建具有不同长度的随机数列表(0 或 1)。我需要长度为 10 个数字、20 个数字等的列表,一直到 500。这就是我所拥有的:

import random
list1 = []
for x in range(10,501,10):
    list1.append(random.randint(0,1))
    print(list1)
    list1.clear()

所以我得到了 50 个只有一个随机数的列表。我知道 range() 是我的问题,因为它只是一个迭代器,那么我该怎么做才能避免编写 50 个 for 循环来获取所有这些列表?

【问题讨论】:

  • 为什么不在range() 中使用random?并将print.clear() 移到循环外?

标签: python arrays python-3.x list random


【解决方案1】:

生成 50 个随机数列表(不按顺序写出所有这些命令)的唯一方法是通过 50 个循环生成数字。在大多数编程语言中执行此操作的标准方法是使用嵌套循环。某些语言具有功能,或available libraries,可以使其更易于编写和/或更高效。 Python 有一个名为list comprehensions 的功能,它使创建列表变得非常容易和方便。

import random
[random.randint(0,1) for _ in range(10)]

它们也可以嵌套来完成你的任务。

import random
[[random.randint(0,1) for _ in range(x)] for x in range(10,501,10)]

时间:

from random import randint
from timeit import timeit

def lc():
    return [[randint(0,1) for _ in range(x)] for x in range(10,501,10)]

def forloop():
    outer = []
    for x in range(10,501,10):
        inner=[]
        for _ in range(x):
            inner.append(randint(0,1))
        outer.append(inner)
    return outer

print(timeit(lc,number=100))  # 9.2758308192958
print(timeit(forloop,number=100)) # 9.44730854274725

嗯。我的印象是列表组合比 for 循环具有更多的速度优势。

【讨论】:

  • 不,我认为这个答案没有任何问题,列表理解很快,并且在一定程度上击败了 numpy 的表现。 Numpy 的开销太大,无法合理地处理小数据。这恰好是一个不愉快的场景,random.randint 是瓶颈。好吧,很重要,有办法解决这个问题。
【解决方案2】:

更有效的解决方案是使用numpy。见Why NumPy instead of Python lists?

import numpy as np

res = [np.random.randint(0, 2, x) for x in range(10, 501, 10)]

这将创建一个二进制值数组列表,数组长度为 10、20、...、490、500。

任何声称嵌套列表理解对于此任务高效的答案都应该注意,在这种情况下,它们比 numpy 慢约 100 倍。

基准测试

import numpy as np
import random

def method_np():
    return [np.random.randint(0, 2, x) for x in range(10, 501, 10)]

def method_lst():
    return [[random.randint(0,1) for _ in range(x)] for x in range(10,501,10)]

%timeit method_np()    # 359 µs
%timeit method_lst()   # 37.3 ms

【讨论】:

  • 为什么要在这里介绍numpy?据我们所知,速度甚至不是问题。
  • 让我们翻转这个问题。当您可以使用专门构建的库对其进行矢量化时,为什么还要使用嵌套循环将项目逐个添加到列表中?
  • 可能是因为 numpy 不是 Python 标准库的一部分,对于像这样一个相对微不足道的问题,安装和开始使用它的潜在麻烦根本不值得。
  • 我会反驳说,只要你想要/需要执行数字 Python 工作,你应该安装numpy
【解决方案3】:

你需要嵌套循环:

import random
list1 = []
for x in range(10,501,10):
    for e in range(x):
        list1.append(random.randint(0,1))
    print(list1)
    list1.clear()

【讨论】:

  • 我在考虑嵌套循环并尝试并失败了,所以这正是我想要的,谢谢!
【解决方案4】:

我想这可以解决你的问题:

   import random
        lists = []
        for x in range(10,501,10):
            l = []
            for _ in range(x):
                l.append(random.randint(0,1))
            lists.append(l)
    print(lists)

【讨论】:

    【解决方案5】:

    问题: 您的代码有 2 个问题,第一个是 range(),第二个是 print(list1) list1.clear() 的缩进。

    固定代码:

    import random
    list1 = []
    ranges = [10,501,10]
    for y in ranges:
        for x in range(0,y):
            list1.append(random.randint(0,1))
        print(list1)
        list1.clear()
    

    【讨论】:

      【解决方案6】:

      由于您似乎只需要打印出列表,因此您可以使用列表推导来生成一定长度的列表。

      import random
      max_list_len = 500
      for l in range(1, max_list_len + 1):
          print([random.randint(0, 1) for i in range(0, l)])
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-02-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-16
        相关资源
        最近更新 更多