round python3 org documentacion docs python python-3.x iterable

python3 - Opuesto a cualquier función()



python getattr (4)

La función incorporada de Python any(iterable) puede ayudar a verificar rápidamente si algún bool(element) es True en un tipo iterable.

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

Pero, ¿hay una forma o función elegante en Python que pueda lograr el efecto opuesto de any(iterable) ? Es decir, si algún bool(element) is False , devuelva True , como en el siguiente ejemplo:

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


Bueno, la implementación de any es equivalent a:

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

Entonces, simplemente cambie la condición de if element a if not element :

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

Sí, por supuesto, esto no aprovecha la velocidad de las funciones integradas como lo hacen las otras respuestas, pero es una buena alternativa legible.


Escriba una expresión generadora que pruebe su condición personalizada. No está obligado solo a la prueba de veracidad predeterminada:

any(not i for i in l)


También existe la función all que hace lo contrario de lo que desea, devuelve True si todos son True y False si alguno es False . Por lo tanto, solo puedes hacer:

not all(l)


Tu puedes hacer:

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

Recordemos que el map en Python 3 es un generador. Para Python 2, probablemente quieras usar imap

Mea Culpa: Después de cronometrar esto, el método que ofrecí es sin duda el más lento

El más rápido not all(l) es not all(l) o not next(filterfalse(bool, it), True) que es solo una variante tonta de itertools. Use la solution Jack Aidleys.

Código de tiempo:

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

Resultados:

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