2011-11-21 26 views
2

我想比較一個用戶輸入列表中的每個元素,其中NL是列表,但由於某種原因它永遠不會進入else循環。其他塊從來沒有執行

NL = range(1, sc.NLayer + 1) 

if (x for x in NL if x < sc.NLayer): 
    print 'true' 
else: 
    print 'false' 

sc.NLayer是用戶輸入。

假定sc.NLayer = 5;它沒有達到其他條件。請幫忙

+0

我不明白這段代碼試圖檢查什麼。你能用簡單的英語解釋嗎? –

+0

我可以告訴你爲什麼它的行爲如此,但馬蒂的權利:爲了解決您的實際問題,我們需要了解您要做的事情,並且由於您的代碼目前沒有任何意義,所以如果您解釋你想要什麼。 – delnan

+0

我想比較用戶輸入到列表中的每個元素,其中NL是列表 – bharath

回答

3

您可能想要使用內置的any函數。

any([True, False, 0, []]) 
=> True 

因此,在你的代碼,這將是:

if any(x for x in NL if x < sc.NLayer): 
    print 'true' 
else: 
    print 'false' 

或者可能是一個for循環:

for x in NL: 
    if x < sc.NLayer: 
     print 'true' 
    else: 
     print 'false' 
+0

當其中一個輸入爲「真」時,您的第一個代碼示例顯示爲「真」。需要注意的是,不像'和'和'or','any()'和'all()'不是**合併。 –

+0

糟糕!好點子!固定。 – TorelTwiddler

2

是的,沒有。

if any(x for x in NL if x <sc.NLayer): 
    print 'true' 
else: 
    print 'false' 
1

如果它不是來自其他答覆清楚,你的問題就出在這裏:

if (x for x in NL if x < sc.NLayer): 

在這個語法中,喲我創建了一個所謂的generator expression,它就像一個列表理解,但它返回一個生成器。發電機本身是一個複雜的物體,因此如果返回它總會評估爲True。生成器有自己的協議,您必須在其中一次顯式檢索一個項目。迭代時,這並不是很明顯,因爲迭代會自動爲你做這件事,但是在評估它時是不同的。相反,如果你真的將其作爲列表理解來執行,你應該得到想要的結果,因爲空列表([])的計算結果爲False!我認爲這更接近你想要的。

下面是一個簡單的例子,用一個列表理解,將返回一個空列表評估mylist的內容來說明:

>>> mylist = range(10) 
>>> [x for x in mylist if x == 'a'] 
[] 

有你的空單。現在評估與bool(),可看到它是False

>>> bool([x for x in mylist if x == 'a']) 
False 

好了,如果你評估它,而不是作爲發電機的表達:

>>> (x for x in mylist if x == 'a') 
<generator object <genexpr> at 0xb7ebc644> 
>>> bool((x for x in mylist if x == 'a')) 
True 

而且爲了說明,如果你施放此生成器表達式到一個列表中,你可以看到它確實沒有結果:

>>> list((x for x in mylist if x == 'a')) 
[] 

我希望有幫助!

相關問題