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

Rob*_*Rob 5 python list typeerror

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

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

这是代码:

lis = list(range(10))
random.seed(70)
for i in range(0, len(lis)):
    randreal = (random.random()*5 + 30)
    lis = list(randreal)
    print(lis)
Run Code Online (Sandbox Code Playgroud)

我觉得我错过了一些明显的东西.当我没有运行代码时

lis=list(randreal)
print(lis)
Run Code Online (Sandbox Code Playgroud)

我得到了我想要的结果,而不是列表.我也试图在没有random.uniform的情况下这样做

Wil*_*sem 6

你写:

lis = list(randreal)
Run Code Online (Sandbox Code Playgroud)

但这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)
Run Code Online (Sandbox Code Playgroud)

但这仍然不是很优雅:你首先构建一个列表,然后再修改它.您可以通过将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)
Run Code Online (Sandbox Code Playgroud)

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

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


小智 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)
Run Code Online (Sandbox Code Playgroud)

或用新的随机值覆盖原始列表的每个值

lis = list(range(10))
random.seed(70)
for i in range(0, len(lis)):
    randreal = (random.random()*5 + 30)
    lis[i] = randreal
print(lis)
Run Code Online (Sandbox Code Playgroud)