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

5
我正在尝试创建一个列表,它从30到35之间提取10个随机实数,并将它们打印出来。当我运行下面的代码时,会出现以下错误:
TypeError: 'float' object is not iterable.
以下是代码:
lis = list(range(10))
random.seed(70)
for i in range(0, len(lis)):
    randreal = (random.random()*5 + 30)
    lis = list(randreal)
    print(lis)

我感觉自己错过了一些非常显然的东西。 当我运行没有…

lis=list(randreal)
print(lis)

我得到了我想要的结果,只是没有以列表的形式呈现。此外,我正在尝试在不使用random.uniform的情况下完成此操作。

1
lis = list(randreal) 应该是做什么用的? - Willem Van Onsem
在我的想法中,它应该建立一个看起来像这样的列表 [34.54884618961936, 等等]。根据您下面的建议,现在它看起来像这样:[34.54884618961936, 1, 2, 3, 4, 5, 6, 7, 8, 9],并且下一个随机浮点数带有1、2、3、4等数字。 - Rob
在第一次迭代之后,是的。但它将继续逐个分配一个元素,并且最终,所有元素都将是随机的。 - Willem Van Onsem
最终输出为 [34.54884618961936, 31.470395203793395, 32.297169396656095, 30.681793552717807, 34.97530360173135, 30.773219981037737, 33.36969776732032, 32.990127772708405, 33.57311858494461, 32.052629620057274] - Willem Van Onsem
2个回答

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<b>[i]</b> = randreal  # assign to an index
    print(lis)

但这仍然不太优雅:你先构造一个列表,然后再修改它。你可以通过绘制10个元素,并每次使用.append(..)添加到列表中来改进代码:

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

这已经好很多了,但仍然是很多代码,所以我们可以使用列表推导式使其更具声明性:

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

或者只需使用LC一步生成列表。 - Ignacio Vazquez-Abrams
对于第一个,我认为你可以这样做:for i in lis: 因为该列表包含索引0到9。 - ivo
@ivo:在这种情况下是的。但这会使代码非常不稳定:如果以后想要在构造列表和填充随机数之间插入一些代码,那么可能会出错。通常最好不要对数据做出这样的假设。 - Willem Van Onsem
@WillemVanOnsem 同意。也许可以创建列表 lis = [0] * 10,这样就不用再创建额外的范围了?看到它们两个都在那里真是让我痛心啊。 :-) - ivo

3
你最初创建了一个列表lst[0,1,2,3,4,5,6,7,8,9],这是不必要的。然后你试图用新的列表list(randreal)覆盖这个列表lst,这会导致错误,因为它不是有效的列表构造函数。
你可以从空列表开始,并添加你创建的每个随机数:
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)

你的第二个建议解决了问题。我尝试创建一个空列表,但它只是打印出一个空列表。你真的帮了大忙。我喜欢这么快的回复。 - Rob
看了其他人的答案,我真的很惊讶你接受了我的答案。其他人建议使用列表推导式一行代码解决问题。正如我所提到的,创建一个包含10个元素的列表,然后覆盖每个元素是相当不必要的。 - Tomáš Zahradníček
我受到限制,只能使用random.random()和random.seed(70)来完成它。我最初使用了random.uniform(30,35)并获得了我想要的结果。我不理解的最大部分是我需要将randreal索引到已经存在的列表中。此外,我非常新手Python。所以列表推导式甚至还没有出现在我的语法里。 - Rob

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接