2013-10-26 58 views
8

我指的是下面的Python代碼如何做所有()在空列表

all(a==2 for a in my_list) 

我希望上面的代碼返回true,如果在my_list所有元素都是2 但是當我蟒蛇工作使my_list爲空並運行它爲

my_list = [] 
all(a==2 for a in my_list) 

它也返回True。我很困惑這種行爲。它不應該返回False,因爲my_list中沒有值爲2的元素?

+0

[在所有空白列表中顯示「all」和「any」結果的原因]的可能重複(http://stackoverflow.com/questions/3275058/reason-for-all-and-any-result-on-empty-列表) –

回答

14

這是真的,因爲對列表中的每一個元素,所有的人都爲0,他們都等於2

你能想到的all被實現爲:

def all(list, condition): 
    for a in list: 
    if not condition(a): 
     return false 
    return true 

鑑於any是:

def any(list, condition): 
    for a in list: 
    if condition(a): 
     return true 
    return false 

也就是說,all是無辜的,直到被證明有罪,any有罪,直到證明無辜。

+0

愛比喻!感謝那 :) – AetherUnbound

4

考慮的all遞歸定義:

def all(L): 
    if L: 
     return L[0] and all(L[1:]) 
    else: 
     ??? 

如果L每一個元素是真實的,那麼它必須是真實的,無論是在L的第一個項目是真實的,all(L[1:])是真實的。這是很容易看到一個列表與幾個項目,但如何一個項目清單。很明顯,如果唯一項目是真的,那麼每個項目都是真實的,但是在這種情況下,我們的遞歸公式是如何工作的?定義all([])爲真使算法起作用。

另一種方式來看待它是任何名單L針對all(L)真的,我們應該能夠識別至少一個元素,a,這是不正確的。但是,L中沒有a,因爲L是空的,所以我們有理由說all([])爲真。

相同的論點適用於any。如果any(L)爲真,我們應該能夠識別L中的至少一個元素。但由於我們不能爲空的清單L,我們可以說any([])是錯誤的。遞歸執行any背上這件事:

def any(L): 
    if L: 
     return L[0] or any(L[1:]) 
    else: 
     return False 

如果L[0]是真的,我們可以永遠不進行遞歸調用返回true,那麼假設L[0]是假的。我們遇到基本情況的唯一方法是,如果沒有L的元素爲真,那麼 如果我們達到它,我們必須返回False

4

「所有」應用於空列表是「空洞地真」,如容易地確認:

>>> all([]) 
True 

類似地,「如果0 = 1,則月亮方」是真實的。更一般地說,「所有P都是Q」 - 如果沒有P,那麼該陳述被認爲是真實的,因爲它可以正式捕獲爲「對於所有x,如果x是P,則x是Q」。最終,這些都是真實的,因爲條件邏輯運算符(if-then)在前件(第一個子句)爲False時評估爲True:「If False then True」評估爲True。回想一下,「如果A然後B」相當於「(不是A)或B」。

相關問題