2013-05-20 70 views
3

我想知道下面的結果如何產生True.None的條件是真?Python所有()方法

任何輸入?

>>> listitem=['a','h','o','t'] 
>>> valid_compare_diff 
['0', '1', '2', '3', '4'] 
>>> all(x for x in listitem if x in valid_compare_diff) 
True 

新變化: -

>>> listitem=['0'] 
>>> valid_compare_diff 
['0', '1', '2', '3', '4'] 
>>> all(x for x in listitem if x in valid_compare_diff) 
True 

怎麼來的結果仍然是真實的,當列表中理解產生的結果??

回答

5

隨着亨尼說,你的收藏是空的,因爲你只能看着那些值是已經填滿你的狀況

要返回檢查的結果,而不是元素,如果檢查合格:

all(x in valid_compare_diff for x in listitem) 

隨着(x for x in listitem if x in valid_compare_diff),你會得到你的情況下,沒有屬於valid_compare_difflistitem所有這些值( )。

隨着(x in valid_compare_diff for x in listitem),每個x,你把表達(x in valid_compare_diff)的價值,給你一個bool爲每x

7

的理解將是空的,因爲沒有的x值滿足條件:

if x in valid_compare_diff

因此:

>>> [x for x in listitem if x in valid_compare_diff] 
[] 

導致[],其傳遞給all返回True

>>> all([]) 
True 

這是因爲的all的定義指出,如果傳遞給它的可迭代爲空,則返回True

all(...) 
    all(iterable) -> bool 

    Return True if bool(x) is True for all values x in the iterable. 
    If the iterable is empty, return True. 
+10

清晰,簡潔,正確。我只想補充一點,這是非常有意義的。這也是數學中的「所有人」行爲的方式。 「所有10英尺高的雞都喜歡跳舞」,因爲那裏沒有10英尺高的雞,他們都喜歡跳舞。這就是所謂的真理。 http://en.wikipedia.org/wiki/Vacuous_truth –

+0

@BenjaminGruenbaum感謝您的洞察力,當我有機會的時候,我會在明天閱讀這篇文章。 – HennyH

+0

你能解釋我的新變化嗎?...所有(['0'])和所有([])都會產生True ..根據python教程,只有迭代爲空纔會產生True .. – user1050619

0
(x for x in listitem if x in valid_compare_diff) 

說:「從listitem這也是valid_compare_diff聚集所有的x秒。通過all()只關心那些你已經拿起的x,所以它會是True,除非你已經拿起至少一個虛假的x - 它不關心(或者甚至不知道)你如何選擇這些x s首先。

相關問題