Напротив любой функции()


встроенная функция Python any(iterable) может помочь быстро проверить, если любой bool(element) - это True в итерационном типе.

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

но есть ли элегантный способ или функция в Python, которые могли бы достичь противоположного эффекта any(iterable)? То есть, если таковые имеются bool(element) is False затем вернуться True, например:

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

4 ответа:

есть еще all функция, которая делает противоположное тому, что вы хотите, она возвращает True если все True и False если есть False. Поэтому вы можете просто сделать:

not all(l)

напишите выражение генератора, которое проверяет ваше пользовательское условие. Вы не привязаны только к умолчанию truthiness тест:

any(not i for i in l)

Ну и реализация any и эквивалентно to:

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

Итак, просто переключите условие с if element до if not element:

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

да конечно это не использует скорость встроенныхany или all как и другие ответы, но это хороший читаемый вариант.

вы можете сделать:

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

Напомним, что map в Python 3 есть генератор. Для Python 2, вы, вероятно, хотите использовать imap


Mea Culpa: после синхронизации этих, метод, который я предложил руки вниз медленная

самый быстрый-это not all(l) или not next(filterfalse(bool, it), True) это просто глупый вариант itertools. Используйте Jack Aidleys решение.

ГРМ код:

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

результаты:

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