108 votes

Comment appliquer un opérateur logique à tous les éléments d'une liste python

J'ai une liste de booléens en python. Je veux ET (ou OU ou NON) les et obtenir le résultat. Le code suivant fonctionne mais n'est pas très pythonique.

def apply_and(alist):
 if len(alist) > 1:
     return alist[0] and apply_and(alist[1:])
 else:
     return alist[0]

Toutes les suggestions sur la façon de le rendre plus pythonique apprécié.

34voto

Jason Baker Points 56682

ANDing et ORing sont faciles :

>>> 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.

17voto

Frank Krueger Points 27508

Réduire peut le faire :

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

Comme Fortran l'a mentionné, tout est la façon la plus succincte de le faire. Mais réduire répond à la question plus générale « Comment appliquer un opérateur logique à tous les éléments d'une liste python ? »

11voto

Eli Bendersky Points 82298

L'idiome de ces opérations est d'utiliser la fonction reduce (globale en Python 2.X, dans le module functools en Python 3.X) avec un opérateur binaire approprié soit pris dans le module operator, soit codé explicitement. Dans votre cas, c'est operator.and_

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

4voto

Xarts Points 42

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 all elements will return True if all elements are True, so no False in a list. ORing est similaire, mais il devrait renvoyer True si au moins une valeur True est présente dans une liste.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X