2009-11-24 20 views

Respuesta

105

lógico and en todos los elementos en a_list:

all(a_list) 

lógico or en todos los elementos en a_list:

any(a_list) 

Si se siente creativo, usted puede también hacer:

import operator 
def my_all(a_list): 
    return reduce(operator.and_, a_list, True) 

def my_any(a_list): 
    return reduce(operator.or_, a_list, False) 

tener en cuenta que los que no son evaluados en cortocircuito, mientras que los muebles empotrados son ;-)

otra manera divertida:

def my_all_v2(a_list): 
    return len(filter(None,a_list)) == len(a_list) 

def my_any_v2(a_list): 
    return len(filter(None,a_list)) > 0 

y otro:

def my_all_v3(a_list): 
    for i in a_list: 
    if not i: 
     return False 
    return True 

def my_any_v3(a_list): 
    for i in a_list: 
    if i: 
     return True 
    return False 

y podríamos seguir todo el día, pero sí, la manera pitónica es usar all y any :-)

Por el wa Y, Python tiene no la eliminación recursión de cola, por lo que no trate de traducir el código LISP directamente ;-)

+7

operator.and_ es el operador de bits y no el lógico y. –

+1

afortunadamente Verdadero y Falso (como el operador quería) se transfieren a 1 y 0 respectivamente, por lo que los operadores a nivel de bit funcionan como lógicos^_^ – fortran

+0

Digno de mención ... 2.5+ pero muy fácil de respaldar. –

10

Reduce puede hacer esto:

reduce(lambda a,b: a and b, alist, True) 

Como se mencionó FORTRAN, todo es la forma más sucinta que hacer eso. Pero reduce las respuestas a la pregunta más general "¿Cómo aplicar un operador lógico a todos los elementos en una lista de Python?"

+4

reduce no va a desaparecer, AFAIK. se está moviendo al módulo functools, desde su posición anterior en el espacio de nombres global –

+1

@eliben: ¿Por qué hablar de Python 3 en tiempo futuro? * reducir sigue ahí *. 'reduce' es' functools.reduce' * en Python 3 * – u0b34a0f6ae

+0

Si elimina ', True', esta respuesta será la única realmente equivalente al código de la pregunta, para las listas no booleanas. –

31

AND y operación OR es fácil:

>>> some_list = [True] * 100 
# OR 
>>> any(some_list) 
True 
#AND 
>>> all(some_list) 
True 
>>> some_list[0] = False 
>>> any(some_list) 
True 
>>> all(some_list) 
False 

de mención es también bastante fácil:

>>> [not x for x in some_list] 
[True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] 

Por supuesto, como se puede utilizar esos resultados podrían requerir algunas aplicaciones interesantes del teorema de De Morgan.

+4

Si desea un cortocircuito de la no variante, simplemente use las expresiones generadoras: 'all (no x para x en some_list)' (pero eso es lo mismo que 'not any (some_list)' (una expresión bastante natural, ¿eh?)). – u0b34a0f6ae

0

Como muestran las otras respuestas, hay varias maneras de lograr esta tarea. Aquí hay otra solución que utiliza funciones de la librería estándar:

from functools import partial 

apply_and = all 
apply_or = any 
apply_not = partial(map, lambda x: not x) 

if __name__ == "__main__": 
    ls = [True, True, False, True, False, True] 
    print "Original: ", ls 
    print "and: ", apply_and(ls) 
    print "or: ", apply_or(ls) 
    print "not: ", apply_not(ls) 
7

La expresión para tales operaciones es utilizar la función de reduce (global en Python 2.X, en el módulo functools en Python 3.x) con un binario apropiado operador tomado del módulo operator o codificado explícitamente.En su caso, es operator.and_

reduce(operator.and_, [True, True, False]) 
2

Aquí hay otra solución:

def my_and(a_list): 
    return not (False in a_list) 

def my_or(a_list): 
    return True in a_list 

AND de todos los elementos devuelve verdadero si todos los elementos son ciertas, por lo tanto, sin falsas en una lista. ORing es similar, pero debería devolver True si al menos un valor True está presente en una lista.

Cuestiones relacionadas