【问题标题】:Finding float average of random list in python在python中查找随机列表的浮点平均值
【发布时间】:2020-10-09 05:14:30
【问题描述】:

我查看了几个网站、书籍和文档,但我无法弄清楚我做错了什么。我尝试寻求帮助作为最后的手段,以便我可以自学,但我花了太长时间试图弄清楚这一点,我确信我做错了很简单,但我我在学习。该代码每次运行时都会产生一个不同的结果。该代码产生以下错误: 26.8 回溯(最近一次通话最后): 文件“main.py”,第 7 行,在 tot = sum(rand)/len(rand) TypeError: 'float' 对象不可迭代

import random
for x in range (10000):
   rand = random.uniform(10, 100)
   print(round(rand, 1))

   tot = sum(rand)/len(rand)
   print (round(tot, 1))

【问题讨论】:

  • random.uniform() 函数返回一个随机浮点数。这是float 类型的单个值。它不返回随机数列表,因此您无法对其求和,也无法获得其长度。
  • 您是在每次迭代中生成单个列表还是新列表?
  • 我在每次迭代中生成一个新列表。

标签: python python-3.x list random average


【解决方案1】:

在 sum 函数中,您必须解析一个可迭代对象,但您正在解析一个浮点对象。 为避免此错误,您应该将最后两行放在 for 循环之外并将 rand 附加到列表中。我不知道这是否是您想要做的,但它向您展示了如何使用sum

import random
l = []
for x in range(10000):
    rand = random.uniform(10, 100)    
    l.append(rand)
    print(round(rand, 1))

tot = sum(l)/len(l)
print(round(tot, 1))

【讨论】:

  • 有没有办法在不附加 rand 的情况下做到这一点?对不起,这项工作,我只是想看看我是否可以在不使用我还没有涉及的东西的情况下让它工作?
  • 您可以使用 random.sample 返回给定列表的 x 个数字,例如 rand = random.sample(range(0,100), 10000) 返回一个列表,其中包含在 [0, 1, 2, 3, .... 98, 99] 列表(范围(0, 100)
【解决方案2】:

您实际上不是在生成列表,而是在生成单个值。 您真的想在获得最终结果的过程中打印出 10000 个值吗?

如果答案是“否!”,那么您的代码可以简化为:

import random

N = 10000
print(round(sum(random.uniform(10, 100) for _ in range(N)) / N, 1))

或者,如果您更愿意将其拆分为便于阅读:

import random

N = 10000
total = sum(random.uniform(10, 100) for _ in range(N))
average = total / N
print(round(average, 1))

如果这超出了您所学的范围,您可以在初始化为零的循环之外创建total,在循环中使用每个新值更新它,然后计算最终答案:

import random

N = 10000
total = 0.0
for _ in range(N):     # use '_' instead of x, since x was unused in your prog
    total += random.uniform(10, 100)
average = total / N
print(round(average, 1))

这避免了为 10000 个值的列表浪费存储空间,并避免了您还不熟悉的 append()。当然,如果您稍后需要 10000 个值用于其他目的,则需要将它们藏在一个列表中:

import random

N = 10000
l = [random.uniform(10, 100) for _ in range(N)]
total = sum(l)
print(round(total / N, 1))

附录

只是为了快乐,你也可以递归地这样做:

import random

def sum_of_rands(n):
    if n > 1:
        half_n = n // 2
        return sum_of_rands(half_n) + sum_of_rands(n - half_n)
    elif n == 1:
        return random.uniform(10, 100)

N = 10000
print(round(sum_of_rands(N) / N, 1))
print(sum_of_rands(0))  # returns None because nothing is being summed

在每次递归调用中将问题分成两半(平均而言)使堆栈保持在 O(log N)。

我实际上建议你坚持使用列表理解或循环,但我想告诉你有很多不同的方法可以得到相同的结果。

【讨论】:

  • 非常感谢!
猜你喜欢
  • 1970-01-01
  • 2015-05-17
  • 1970-01-01
  • 2012-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多