2013-10-26 12 views
8

ich auf die folgende Python-Code beziehe michWie funktioniert all() in Python Arbeit auf leere Listen

all(a==2 for a in my_list) 

ich den obigen Code erwarten Wahr zurück, wenn alle Elemente in my_list sind 2. aber wenn ich mache my_list leer und führe es als

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

aus es gibt True zurück. Ich bin mit diesem Verhalten verwirrt. Soll False nicht zurückgegeben werden, da es in my_list kein Element mit dem Wert 2 gibt?

+0

mögliche Duplikate von [Grund für "alle" und "alle" Ergebnis auf leeren Listen] (http://stackoverflow.com/questions/3275058/reason-for-all-and-any-result-on-empty- Listen) –

Antwort

14

Es ist wahr, weil für jedes Element in der Liste, die alle 0 von ihnen, sie sind alle gleich 2

Sie von all denken können als umgesetzt:

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

Während any ist:

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

Das heißt, ist all unschuldig, bis seine Schuld bewiesen ist, und any schuldig bis zum Beweis unschuldig.

+0

Liebe die Analogie! Dank dafür :) – AetherUnbound

4

Betrachten wir eine rekursive Definition von all:

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

Wenn jedes Element in L wahr ist, dann muss es wahr sein, dass sowohl das erste Element in L wahr ist, und dass all(L[1:]) wahr ist. Dies ist leicht zu sehen für eine Liste mit mehreren Artikeln, aber was ist mit einer Liste mit einen Artikel. Natürlich ist jeder Gegenstand wahr, wenn der einzige Gegenstand wahr ist, aber wie funktioniert unsere rekursive Formulierung in diesem Fall? Wenn Sie all([]) als wahr definieren, funktioniert der Algorithmus.

Ein anderer Weg, um es zu betrachten ist, dass für jede Liste L für die all(L)nicht wahr ist, sollten wir a, zu identifizieren, mindestens ein Element der Lage sein, das nicht wahr ist. Allerdings gibt es keine a in L, wenn L leer ist, so dass wir berechtigt sind zu sagen, dass all([]) wahr ist.

Die gleichen Argumente funktionieren für any. Wenn any(L) wahr ist, sollten wir in der Lage sein, mindestens ein Element in L zu identifizieren, das wahr ist. Aber da wir nicht für eine leere Liste L können, können wir sagen, dass any([]) falsch ist. Eine rekursive Implementierung von any Rücken auf den Punkt:

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

Wenn L[0] wahr ist, können wir true zurück, ohne jemals den rekursiven Aufruf zu machen, so übernehmen L[0] falsch ist. Die einzige Möglichkeit, den Basisfall zu erreichen, ist, wenn kein Element von L wahr ist, also wir False zurückgeben müssen, wenn wir es erreichen.

4

"all" auf eine leere Liste angelegt ist "vacuously true", wie man leicht bestätigt:

>>> all([]) 
True 

ähnlich "wenn 0 = 1, dann der Mond Quadrat ist" wahr ist. Ganz allgemein, "alle P sind Q" - wenn es keine P gibt, dann wird die Aussage als wahr betrachtet, da sie formell als "Für alle x, wenn x P ist, dann ist x Q" erfasst wird. Letztendlich sind diese Wahrheiten wahr, weil der bedingte logische Operator (if-then) immer True ergibt, wenn der Antezedens (die erste Klausel) False ist: "if False then True" ergibt True. Erinnern Sie sich, dass "wenn A dann B" gleich "(nicht A) oder B" ist.