【问题标题】:Python for-loop to list comprehensionPython for 循环列表理解
【发布时间】:2023-03-11 12:40:01
【问题描述】:

我是 Python 的初学者,正在自学列表推导。几乎所有我一直在翻译为列表理解的 for 循环代码我都做得很好,但我非常坚持我认为是一个相当简单的循环。

n = 10000

def sim(y):
  count = 0
  for i in range(10000):
    if 0.9 <= y[i] <= 1.8:
        count += 1
  probability = count/10000.0
  print("P(a < x <= b) : {0:8.4f}".format(probability))


print ("\t case: \n"),sim([0.25 if random() < 0.8 else 1.5 for r in range(n)])

到目前为止,我一直在尝试以下变体,但都遇到了与使用列表相关的错误,例如“'int' object is unsubscriptable”和“unsupported operand type(s) for +: 'int' and '列表'”。

def sim(y):
  c4 = sum([y for range(y) in range(len(y)) if 0.9 < y[i] <= 1.8])/10000
  print("P(a < x <= b) : {0:8.4f}".format(c4))

其目的基本上是获取传递给 sim() 的参数并迭代它的长度,同时仅对那些在 0.9 和 1.8 之间的条件发现为真的值递增 1。我正在尝试检查 n 个随机数中的每一个是否符合该条件。然后只对那些正确的相加。

顺便说一句,答案应该在 0.2 左右——如果您想检查它,只需考虑 1.5 是适合 0.9 和 1.8 之间的唯一方法。

感谢您在我学习过程中的耐心。

【问题讨论】:

    标签: python for-loop list-comprehension


    【解决方案1】:

    您仍然需要为每个循环提供一个表达式,并且您的 for y in 部分相当失控。以下作品:

    c4 = sum(1 for i in y if 0.9 < i <= 1.8) / 10000.0
    

    这相当于:

    count = 0
    for i in y:
        if 0.9 < i <= 1.8:
            count += 1
    c4 = count / 10000.0
    

    也许10000.0 应该是float(len(y)),但从您的示例中并不完全清楚。

    我们使用1000.0 或float(len(y)) 来避免使用整数除法,这将导致0 作为答案。或者,您可以使用from __future__ import division 使/ 除法运算符默认使用浮点除法,请参阅PEP 238。

    注意我给你做了一个生成器表达式,不需要先存储一个列表。

    【讨论】:

    • 感谢 Martijn,但似乎并没有将所有数字相加。它返回 0.00 结果。我试过 0.9
    • @stackuser:啊,那是因为这是整数除法;更正以使其改为浮动除法。
    • @stackuser:试试我的版本。i 不是y 的索引,它是一个值来自 y。代码循环遍历 y 本身,而不是 range()..
    • 非常感谢!那解决了它。我看到您正在迭代 y 并使用 i 作为您比较的列表中的特定点然后给它一个值 1 如果 true 然后求和。感谢您帮助我学习!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-28
    相关资源
    最近更新 更多