与any()函数相反

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)

  • 如果iterable为空,不确定OP想要什么,但值得注意的是,`all`在空迭代时返回True. (21认同)
  • +1从长远来看,一点点数学逻辑知识可以节省大量时间:`∃x:¬x`相当于`¬(∀x:x)`.见[here](https://en.wikipedia.org/wiki/Existential_quantification#Negation) (15认同)
  • 对于`all(...)`你总是可以在参数列表中添加`True`而不改变输出.`True`是一个"中性元素"(就像0加法,1乘法是中性元素).这就是为什么空的`all()`返回'True`.对于`any()`,中性元素是'False`. (6认同)

dec*_*eze 48

编写一个生成器表达式来测试您的自定义条件 您不仅限于默认的真实性测试:

any(not i for i in l)
Run Code Online (Sandbox Code Playgroud)

  • @EkeymeMo避免使用`=='来比较布尔值.只需使用裸值,例如.`if value:...`.但是,如果您必须检查对象是否是布尔值而不是真实值,请使用`is`.否则你会得到意想不到的结果 - 例如.`1 == True`是真的,但是`2 == True`是假的. (4认同)
  • 这比`not all(l)`慢得多 (4认同)
  • 是的,可能是'任何(bool(i)==我在l中的假)`更好.对?`None == False`是'False`,但我不想那样.`bool(无)== False`是'True` (2认同)
  • 在那种情况下,"我不是我的l"可能是最好的. (2认同)

Jim*_*ard 16

那么,执行any等价于:

def any(iterable):
    for element in iterable:
        if element:
            return True
    return False
Run Code Online (Sandbox Code Playgroud)

所以,只需将条件从切换if elementif 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像其他答案一样,但它是一个很好的可读替代方案.

  • @JackAidley*当然是*,我从来没有做过任何断言.我刚刚添加了另一种选择.请记住,"任何"和"所有"通常对新用户来说都是神秘的,看看他们的粗略实现通常会有所帮助. (5认同)

daw*_*awg 9

你可以做:

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