2013-03-18 2 views
1

est-ce un comportement normal?Python vérifier la condition dans tous sur la liste vide

answer=all(c=='false True answer?' for c in []) 
# answer = True 

ce que ce sera ok si je veux faux sur les valeurs de contrôle par "tous" à la liste vide pour utiliser cette ligne:

answer=all(set([c=='a' for c in []]) or [False,]) 

semble ok si:

answer=all(set([c=='a' for c in ['a','a']]) or [False,]) 
answer=all(set([c=='a' for c in ['a','b']]) or [False,]) 

i décider d'utiliser une logique inverse comme:

bad_answer=bool([c for c in ['a','b'] if c!='a']) 
+1

Il n'y a pas de Faux, donc tout est Vrai ... – eumiro

+0

mais c n'est pas égal à la chaîne? ou ce n'est même pas comparé? – Tard

Répondre

2

all() is documented comme

Retour Vrai si tous les éléments du itérables sont vraies (ou si le itérables est vide).

L'expression de votre générateur c=='false True answer?' for c in [] est vide car elle itère sur une liste vide. La comparaison n'arrive jamais car il n'y a rien in [].

3
In [2]: all([]) 
Out[2]: True 

Oui.

c == '...'c == '...' ne sera jamais évalué car le for c in [] n'admet aucun élément. La compréhension de la liste est évaluée à [] immédiatement lorsque le iterable dans for c in iterable est vide.

3

Vous vérifiez si tous les éléments d'une liste vide sont égaux à une certaine valeur. Parce qu'il n'y a pas de valeurs dans la liste, techniquement toutes les valeurs sont égale à cette autre valeur.

>>> all([]) 
True 

all retours False si des expressions sont False, ou autrement. True Parce qu'aucune des conditions ne sont pas vraies (puisqu'il n'y en a aucun en premier lieu), all renvoie True.

1

all évalue toujours à True lors d'une opération sur une séquence vide. Alors oui, c'est normal.

Questions connexes