2008-12-20 8 views

Respuesta

31

La función incorporada any hace lo que quiere:

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

any tiene la ventaja sobre reduce del acortando la prueba para los artículos posteriores en la secuencia una vez que encuentra un valor verdadero. Esto puede ser muy útil si la secuencia es un generador con una costosa operación detrás. Por ejemplo:

>>> 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 la versión de su Python no tiene any(), all() órdenes internas continuación, se implementan fácilmente como 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

usted puede hacer esto:

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

reducir debería hacerlo por usted, ¿no debería ?

>>> 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 y posteriores (documentation)

7

Nadie lo ha mencionado, pero "or" está disponible como una función en el módulo de operador:

from operator import or_ 

Luego puede usar reduce como se indica anteriormente.

Siempre aconsejaría "any" en las pitones más recientes.

Cuestiones relacionadas