Logique à and
travers tous les éléments dans a_list
:
all(a_list)
Logique à or
travers tous les éléments dans a_list
:
any(a_list)
Si vous vous sentez créatif, vous pouvez également faire:
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)
gardez à l'esprit que ceux-ci ne sont pas évalués en court-circuit, tandis que les intégrés le sont ;-)
une autre façon amusante:
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
et encore un autre:
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
et nous pourrions continuer toute la journée, mais oui, la manière pythonique est d'utiliser all
et any
:-)
Au fait, Python n'a pas d'élimination de la récursivité, alors n'essayez pas de traduire directement le code LISP ;-)
reduce()
c'estfunctools
depuis Python 3.0ANDing et ORing est facile:
>>> 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
NOTing est également assez facile:
>>> [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]
Bien sûr, la façon dont vous utiliseriez ces résultats pourrait nécessiter des applications intéressantes du théorème de DeMorgan.
la source
all(not x for x in some_list)
(mais c'est la même chose quenot any(some_list)
(une expression assez naturelle, hein?)).Réduire peut faire ceci:
reduce(lambda a,b: a and b, alist, True)
Comme l'a mentionné fortran, tout est la manière la plus succincte de le faire. Mais réduisez les réponses à la question plus générale "Comment appliquer un opérateur logique à tous les éléments d'une liste python?"
la source
reduce
estfunctools.reduce
en Python 3, True
, cette réponse sera la seule réellement équivalente au code de la question, pour les listes non booléennes.L'idiome pour de telles opérations est d'utiliser la
reduce
fonction (globale en Python 2.X, en modulefunctools
en Python 3.X) avec un opérateur binaire approprié, soit pris dans leoperator
module, soit codé explicitement. Dans votre cas, c'estoperator.and_
reduce(operator.and_, [True, True, False])
la source
Voici une autre solution:
def my_and(a_list): return not (False in a_list) def my_or(a_list): return True in a_list
ANDing tous les éléments renverra True si tous les éléments sont True, donc aucun False dans une liste. ORing est similaire, mais il doit renvoyer True si au moins une valeur True est présente dans une liste.
la source
Comme le montrent les autres réponses, il existe plusieurs façons d'accomplir cette tâche. Voici une autre solution qui utilise des fonctions de la bibliothèque standard:
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)
la source