Напротив любой функции()
встроенная функция 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 ответа:
есть еще
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