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的情况下这样做
你写:
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)