我想比較一個用戶輸入列表中的每個元素,其中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
;它沒有達到其他條件。請幫忙
我想比較一個用戶輸入列表中的每個元素,其中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
;它沒有達到其他條件。請幫忙
您可能想要使用內置的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'
當其中一個輸入爲「真」時,您的第一個代碼示例顯示爲「真」。需要注意的是,不像'和'和'or','any()'和'all()'不是**合併。 –
糟糕!好點子!固定。 – TorelTwiddler
是的,沒有。
if any(x for x in NL if x <sc.NLayer):
print 'true'
else:
print 'false'
如果它不是來自其他答覆清楚,你的問題就出在這裏:
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'))
[]
我希望有幫助!
我不明白這段代碼試圖檢查什麼。你能用簡單的英語解釋嗎? –
我可以告訴你爲什麼它的行爲如此,但馬蒂的權利:爲了解決您的實際問題,我們需要了解您要做的事情,並且由於您的代碼目前沒有任何意義,所以如果您解釋你想要什麼。 – delnan
我想比較用戶輸入到列表中的每個元素,其中NL是列表 – bharath