【问题标题】:Turning a random.random() result into a list - Python将 random.random() 结果转换为列表 - Python
【发布时间】:2018-02-04 14:34:01
【问题描述】:

我正在尝试创建一个列表,该列表从 30 到 35 之间抽取十个随机实数并将它们打印在列表中。当我运行以下代码时,出现以下错误:

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)

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

lis=list(randreal)
print(lis)

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

【问题讨论】:

  • lis = list(randreal) 应该做什么?
  • 在我看来,它应该建立一个看起来像这样的列表 [34.54884618961936,等等]。根据您的建议,现在看起来像这样:[34.54884618961936, 1, 2, 3, 4, 5, 6, 7, 8, 9] 和下一个随机浮点数为 1,2,3,4 等
  • 第一次迭代后,是的。但它会一直一次分配一个元素,最后,所有元素都是随机的。
  • 最终输出为[34.54884618961936, 31.470395203793395, 32.297169396656095, 30.681793552717807, 34.97530360173135, 30.773219981037737, 33.36969776732032, 32.990127772708405, 33.57311858494461, 32.052629620057274]

标签: python list typeerror


【解决方案1】:

你写:

lis = list(randreal)

但是list(..) 在这里是一个构造函数。构造函数寻找一个可迭代的对象(另一个列表、一个集合、一个字典、一个生成器等),它可以变成一个列表。浮点是 not 可迭代的,因此它不能为此构造一个列表。因此会出错。

解决它的一种方法是分配给列表的索引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)

【讨论】:

  • 或者只使用LC一步生成列表。
  • 对于第一个,我认为你可以这样做:for i in lis:,因为列表包含索引 0 到 9。
  • @ivo:在这种情况下是的。但这会使代码非常不稳定:如果以后希望在构建列表和用随机数填充列表之间插入一些代码,它可能会出错。通常最好不要对数据做出这样的假设。
  • @WillemVanOnsem 同意。也许使用lis = [0] * 10 创建列表可以节省创建额外范围?看到他们俩都在那里,我很痛苦。 :-)
【解决方案2】:

您首先创建了列表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)

【讨论】:

  • 您的第二个建议成功了。我尝试创建空列表,但它只打印一个空列表。你帮了大忙。我喜欢快速响应。
  • 看别人的答案我真的很惊讶你接受了我的。其他人建议使用列表理解一个班轮。正如我所提到的,创建 10 个元素的列表然后覆盖每个元素是非常不必要的。
  • 我受到限制,不得不在不使用任何东西的情况下完成它,只使用 random.random() 和 random.seed(70)。我最初使用 random.uniform(30,35) 并得到了我喜欢的结果。我不理解的最大部分是我需要将 randreal 索引到已经存在的列表中。我对 python 也很陌生。所以列表理解对我来说甚至还没有出现在同一个句子中。
猜你喜欢
  • 1970-01-01
  • 2020-09-10
  • 1970-01-01
  • 2018-10-08
  • 1970-01-01
  • 2016-12-28
  • 1970-01-01
  • 1970-01-01
  • 2018-11-20
相关资源
最近更新 更多