77 votes

Opposé à la fonction any()

La fonction intégrée de Python any(iterable) peut aider à vérifier rapidement si une bool(element) est True dans un type itérable.

>>> l = [None, False, 0]
>>> any(l)
False
>>> l = [None, 1, 0]
>>> any(l)
True

Mais existe-t-il un moyen ou une fonction élégante en Python qui permettrait d'obtenir l'effet contraire de any(iterable) ? C'est-à-dire, si un bool(element) is False alors retour True comme dans l'exemple suivant :

>>> l = [True, False, True]
>>> any_false(l)
>>> True

6 votes

Votre question a déjà été correctement répondue par Jack Aidley. Vous pouvez vérifier fr.wikipedia.org/wiki/De_Morgan's_laws pour la théorie qui se cache derrière.

2 votes

La réponse de JackAidley et celle de Deceze peuvent toutes deux être utiles en fonction de votre problème. Notez que "any element is falsy" n'est pas la même chose que "no element is truthy" - ils ont des réponses différentes pour le tableau vide.

129voto

Jack Aidley Points 3993

Il y a aussi la fonction all qui fait le contraire de ce que vous voulez, elle retourne True si tous sont True et False cas échéant sont False . Par conséquent, vous pouvez simplement faire:

 not all(l)
 

50voto

deceze Points 200115

Ecrivez une expression de générateur qui teste votre condition personnalisée. Vous n'êtes pas lié au seul test de véracité par défaut:

 any(not i for i in l)
 

16voto

Jim Points 8793

Eh bien, la mise en œuvre de any est équivalente à:

 def any(iterable):
    for element in iterable:
        if element:
            return True
    return False
 

Il suffit donc de changer la condition de if element à if not element :

 def reverse_any(iterable):
    for element in iterable:
        if not element:
            return True
    return False
 

Oui, bien sûr, cela n’exploite pas la vitesse des réponses intégrées any ou all comme le font les autres réponses, mais c’est une bonne alternative lisible.

9voto

dawg Points 26051

Vous pouvez le faire:

>>> l = [True, False, True]
>>> False in map(bool, l)
True

Rappelons qu' map en Python 3 est un générateur. Pour Python 2, vous voudrez probablement utiliser imap


Mea Culpa: Après le chronométrage de ces, la méthode que j'ai proposé est de loin le plus lent

La plus rapide est not all(l) ou not next(filterfalse(bool, it), True) qui est juste un idiot itertools variante. Utiliser la Prise Aidleys solution.

Code de Timing:

from itertools import filterfalse

def af1(it):
    return not all(it)

def af2(it):
    return any(not i for i in it)   

def af3(iterable):
    for element in iterable:
        if not element:
            return True
    return False    

def af4(it):
    return False in map(bool, it)   

def af5(it):
    return not next(filterfalse(bool, it), True)    

if __name__=='__main__':
    import timeit   
    for i, l in enumerate([[True]*1000+[False]+[True]*999, # False in the middle
                           [False]*2000, # all False
                            [True]*2000], # all True
                            start=1): 
        print("case:", i)
        for f in (af1, af2, af3, af4, af5):
            print("   ",f.__name__, timeit.timeit("f(l)", setup="from __main__ import f, l", number=100000), f(l) )

Résultats:

case: 1
    af1 0.45357259700540453 True
    af2 4.538436588976765 True
    af3 1.2491040650056675 True
    af4 8.935278153978288 True
    af5 0.4685744970047381 True
case: 2
    af1 0.016299808979965746 True
    af2 0.04787631600629538 True
    af3 0.015038023004308343 True
    af4 0.03326922300038859 True
    af5 0.029870904982089996 True
case: 3
    af1 0.8545824179891497 False
    af2 8.786235476000002 False
    af3 2.448748088994762 False
    af4 17.90895140200155 False
    af5 0.9152941330103204 False

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