2008-12-20 5 views

Répondre

31

La fonction intégrée any fait ce que vous voulez:

>>> any([True, True, False]) 
True 
>>> any([False, False, False]) 
False 
>>> any([False, False, True]) 
True 

any a l'avantage sur reduce de court-circuiter le test pour les éléments plus tard dans la séquence une fois qu'il trouve une vraie valeur. Cela peut être très utile si la séquence est un générateur avec une opération coûteuse derrière elle. Par exemple:

>>> def iam(result): 
... # Pretend this is expensive. 
... print "iam(%r)" % result 
... return result 
... 
>>> any((iam(x) for x in [False, True, False])) 
iam(False) 
iam(True) 
True 
>>> reduce(lambda x,y: x or y, (iam(x) for x in [False, True, False])) 
iam(False) 
iam(True) 
iam(False) 
True 

Si votre version de Python n'a pas any(), all() builtins ils sont facilement mises en œuvre comme Guido van Rossum suggested:

def any(S): 
    for x in S: 
     if x: 
      return True 
    return False 

def all(S): 
    for x in S: 
     if not x: 
      return False 
    return True 
2

Vous pouvez le faire:

reduce(lambda a,b: a or b, [True, True, False]) 
1

réduire devrait le faire pour vous, il ne devrait pas ?

>>> def _or(x, y): 
...  return x or y 
... 
>>> reduce(_or, [True, True, False]) 
True 
3
>>> all([True,False,True]) 
False 
>>> any([True,False,True]) 
True 

Python 2.5 et plus (documentation)

7

Personne ne l'a mentionné, mais "or" est disponible en tant que fonction dans le module opérateur:Puis vous pouvez utiliser reduce comme ci-dessus.

Conseillerait toujours "any" mais dans les plus récents Pythons.

Questions connexes