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, también puede 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)
tenga en cuenta que esos no se evalúan en cortocircuito, mientras que los incorporados sí lo son ;-)
otra forma 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 más:
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 forma pitónica es usar all
y any
:-)
Por cierto, Python no tiene eliminación de recursividad de cola, así que no intente traducir el código LISP directamente ;-)
reduce()
en cuenta que está disponiblefunctools
desde Python 3.0Hacer AND y 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
NOTAR también es 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, la forma en que usaría esos resultados podría requerir algunas aplicaciones interesantes del teorema de DeMorgan.
fuente
all(not x for x in some_list)
(pero eso es lo mismo quenot any(some_list)
(una expresión bastante natural, ¿eh?)).Reducir puede hacer esto:
reduce(lambda a,b: a and b, alist, True)
Como mencionó fortran, todo es la forma más sucinta de hacerlo. Pero reduzca las respuestas a la pregunta más general "¿Cómo aplicar un operador lógico a todos los elementos en una lista de Python?"
fuente
reduce
estáfunctools.reduce
en Python 3, True
, esta respuesta será la única realmente equivalente al código de la pregunta, para listas no booleanas.El lenguaje para tales operaciones es usar la
reduce
función (global en Python 2.X, en el módulofunctools
en Python 3.X) con un operador binario apropiado, ya sea tomado deloperator
módulo o codificado explícitamente. En tu caso, esoperator.and_
reduce(operator.and_, [True, True, False])
fuente
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
La operación AND de todos los elementos devolverá True si todos los elementos son True, por lo tanto, no False en una lista. La operación OR es similar, pero debería devolver True si al menos un valor True está presente en una lista.
fuente
Como muestran las otras respuestas, hay varias formas de realizar esta tarea. Aquí hay otra solución que usa funciones de la biblioteca 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)
fuente