2012-11-17 50 views
5

我是一個Python的初學者,並教我自己的列表解析。幾乎所有我已經轉化爲列表理解的for循環代碼我都做得很好,但是我很堅持我認爲是一個相當簡單的循環。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)]) 

到目前爲止,我一直在嘗試以下的變化,但它是諸如「‘廉政’的對象是unsubscriptable」和「不支持的操作數類型(S)爲+與使用名單的所有收到錯誤信息: 'int'和'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(參數)和迭代它的長度,同時通過1僅用於那些值遞增發現爲真0.9和1.8之間的條件。我試圖檢查n條隨機數中的每一個。然後只求和那些是真的。

順便說一句,答案應該制定出約0.2 - 如果你要檢查它只是想想1.5是唯一的途徑,以0.9和1.8之間的配合。

我感謝您的耐心,因爲我學習。

回答

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.0float(len(y)),但是這不是從你的例子完全清楚。

我們使用1000.0float(len(y))來避免使用整數除法,這將導致0作爲答案。或者,您可以使用from __future__ import division使/除法運算符默認使用浮點除法,請參閱PEP 238

注意,我做了一個發電機表達對你來說,沒有必要先儲存一個列表。

+0

感謝Martijn,但它似乎並沒有得到所有的數字總結。它返回0.00結果。我嘗試過0.9 stackuser

+0

@stackuser:啊,那是因爲這是整數除法;改正,以使其浮動分裂。 –

+0

@stackuser:嘗試我的版本..'我'不是'y'的索引,它是來自*'y'的值*。代碼循環遍歷'y',而不是在'range()'上。 –