Python循环语句转换为列表推导式

5

我是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 'list'”。

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随机数是否符合此条件,然后只求和那些为true的数字。

顺便说一下,答案应该大约为0.2 -- 如果您想检查它,只需考虑1.5是符合0.9和1.8之间的唯一方法。

感谢您的耐心等待,因为我正在学习。

1个回答

6

您仍需要为每个循环提供表达式,而您的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.0float(len(y)) 以避免使用整数除法,这会导致答案为 0。另外,您可以使用 from __future__ import division 来使 / 除法运算符默认使用浮点除法,请参见 PEP 238
请注意,我已将其设置为生成器表达式,无需首先存储列表。

谢谢Martijn,但似乎没有将所有数字相加。它返回0.00结果。我尝试了0.9<y[i]<=1.8,但出现错误“TypeError:list indices must be integers, not float”。我不确定在条件中比较i如何影响列表值,而似乎是在比较循环中的给定数字。 - stackuser
@stackuser:啊,那是因为这是整数除法;已更正为浮点数除法。 - Martijn Pieters
@stackuser:试试我的版本… i 不是一个指向 y 的索引,而是来自 y 的值。代码循环遍历 y 本身,而不是 range() - Martijn Pieters
非常感谢!问题解决了。我看到你正在遍历y并使用i作为列表中特定点的比较位置,如果为真,则将其值设置为1,然后求和。感谢您帮助我学习! - stackuser

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