Lógico and
em todos os elementos em a_list
:
all(a_list)
Lógico or
em todos os elementos em a_list
:
any(a_list)
Se você se sentir criativo, também pode fazer:
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)
tenha em mente que aqueles não são avaliados em curto-circuito, enquanto os integrados são ;-)
outra maneira engraçada:
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
e ainda outro:
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
e poderíamos continuar o dia todo, mas sim, a forma pythônica é usar all
e any
:-)
A propósito, Python não tem eliminação de recursão de cauda, então não tente traduzir o código LISP diretamente ;-)
reduce()
está disponívelfunctools
desde Python 3.0ANDing e ORing é 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 também é 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]
Claro, como você usaria esses resultados pode exigir algumas aplicações interessantes do teorema de DeMorgan.
fonte
all(not x for x in some_list)
(mas isso é o mesmo quenot any(some_list)
(uma expressão bastante natural, hein?)).Reduzir pode fazer isso:
reduce(lambda a,b: a and b, alist, True)
Quanto ao fortran mencionado, tudo é a maneira mais sucinta de fazer isso. Mas a redução responde à questão mais geral "Como aplicar um operador lógico a todos os elementos em uma lista python?"
fonte
reduce
estáfunctools.reduce
em Python 3, True
, esta resposta será a única realmente equivalente ao código da pergunta, para listas não booleanas.O idioma para tais operações é usar a
reduce
função (global em Python 2.X, em módulofunctools
em Python 3.X) com um operador binário apropriado retirado dooperator
módulo ou codificado explicitamente. No seu caso, éoperator.and_
reduce(operator.and_, [True, True, False])
fonte
Aqui está outra solução:
def my_and(a_list): return not (False in a_list) def my_or(a_list): return True in a_list
Fazer AND de todos os elementos retornará True se todos os elementos forem True, portanto, nenhum False em uma lista. ORing é semelhante, mas deve retornar True se pelo menos um valor True estiver presente em uma lista.
fonte
Como mostram as outras respostas, existem várias maneiras de realizar essa tarefa. Aqui está outra solução que usa funções da biblioteca padrão:
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)
fonte