Eke*_* Mo 67 python iterable python-3.x
Python的内置功能any(iterable)
可以帮助快速检查是否有bool(element)
是True
一个迭代的类型.
>>> l = [None, False, 0]
>>> any(l)
False
>>> l = [None, 1, 0]
>>> any(l)
True
Run Code Online (Sandbox Code Playgroud)
但是Python中有一种优雅的方式或功能可以达到相反的效果any(iterable)
吗?也就是说,如果有的bool(element) is False
话返回True
,如下例所示:
>>> l = [True, False, True]
>>> any_false(l)
>>> True
Run Code Online (Sandbox Code Playgroud)
Jac*_*ley 115
还有all
一个与你想要的相反的功能,True
如果所有的都是True
,False
那么它会返回False
.因此你可以这样做:
not all(l)
Run Code Online (Sandbox Code Playgroud)
dec*_*eze 48
编写一个生成器表达式来测试您的自定义条件 您不仅限于默认的真实性测试:
any(not i for i in l)
Run Code Online (Sandbox Code Playgroud)
Jim*_*ard 16
那么,执行any
是等价于:
def any(iterable):
for element in iterable:
if element:
return True
return False
Run Code Online (Sandbox Code Playgroud)
所以,只需将条件从切换if element
到if not element
:
def reverse_any(iterable):
for element in iterable:
if not element:
return True
return False
Run Code Online (Sandbox Code Playgroud)
是的,当然这并没有利用内置插件的速度any
或者all
像其他答案一样,但它是一个很好的可读替代方案.
你可以做:
>>> l = [True, False, True]
>>> False in map(bool, l)
True
Run Code Online (Sandbox Code Playgroud)
回想一下,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) )
Run Code Online (Sandbox Code Playgroud)
结果:
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
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
11697 次 |
最近记录: |