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