将random.random()结果转换为列表 - Python

时间:2017-08-26 22:13:58

标签: python list typeerror

我试图创建一个列表,在30到35之间抽取10个随机实数,然后将它们打印出来。当我运行以下代码时,我收到以下错误:

  

TypeError:' float'对象不可迭代。

以下是代码:

      Durbin-Watson test                    

 data:  y ~ x + x2 + x3 + x4 + x5 + x6 + x7 + x8                    
 DW = 2.816, p-value = 1                    
 alternative hypothesis: true autocorrelation is greater than 0                 

我觉得我错过了一些明显的东西。 当我在没有

的情况下运行代码时
lis = list(range(10))
random.seed(70)
for i in range(0, len(lis)):
    randreal = (random.random()*5 + 30)
    lis = list(randreal)
    print(lis)

我得到了我想要的结果,而不是列表。我也试图在没有random.uniform

的情况下这样做

2 个答案:

答案 0 :(得分:6)

你写道:

lis = list(randreal)

但是list(..)在这里是一个构造函数。构造函数查找可以转换为列表的可迭代对象(另一个列表,集合,字典,生成器等)。浮点可迭代,因此无法为其构造列表。因此会出错。

解决问题的一种方法是分配到列表lis 的索引:

lis = [0] * 10
random.seed(70)
for i in range(0, len(lis)):
    randreal = (random.random()*5 + 30)
    lis[i] = randreal  # assign to an index
    print(lis)

但这仍然不是很优雅:你首先构建一个列表,然后再修改它。您可以通过绘制 10 元素并且每次.append(..)到列表来改进代码:

lis = []
random.seed(70)
for i in range(0,10):
    randreal = (random.random()*5 + 30)
    lis.append(randreal)  # append to the list
    print(lis)

这已经更好了,但仍然是很多代码,所以我们可以使用 list comprehension 来使它更具说明性:

random.seed(70)
lis = [random.random()*5 + 30 for _ in range(10)]
print(lis)

答案 1 :(得分:3)

您首先创建了列表lst [0,1,2,3,4,5,6,7,8,9]。这是不必要的。然后你试图用新列表lst覆盖这个列表list(randreal),这会引发错误,因为它是无效的列表构造函数

您可以从空列表开始,并附加您创建的每个随机数:

lis = []
random.seed(70)
for i in range(10):
    randreal = (random.random()*5 + 30)
    lis.append(randreal)
print(lis)

或用新的随机值

覆盖原始列表的每个值
lis = list(range(10))
random.seed(70)
for i in range(0, len(lis)):
    randreal = (random.random()*5 + 30)
    lis[i] = randreal
print(lis)