与any()函数相反

时间:2016-08-10 09:19:41

标签: python python-3.x iterable

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 个答案:

答案 0 :(得分:112)

还有all函数与您想要的相反,如果True全部为True,则返回False False not all(l) }。因此你可以这样做:

CREATE FUNCTION dbo.ListDates
(
     @StartDate    DATETIME  
    ,@EndDate      DATETIME
)
RETURNS
@DateList table
(
    Date datetime
)
AS
BEGIN

/*add some validation logic of your own to make sure that the inputs are sound.Adjust the rest as needed*/

  INSERT INTO
    @DateList
  SELECT FLD_Date FROM TableOfDates (NOLOCK) WHERE FLD_Date >= @StartDate AND FLD_Date <= @EndDate
  RETURN
END

答案 1 :(得分:47)

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

any(not i for i in l)

答案 2 :(得分:16)

嗯,any的实施是equivalent到:

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

是的,当然 这并没有像其他答案一样利用内置插件anyall的速度,但它是一个很好的可读替代方案。

答案 3 :(得分:9)

你可以这样做:

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

回想一下,Python 3中的map是一个生成器。对于Python 2,您可能希望使用imap

Mea Culpa:在计时之后,我提供的方法是放下最慢​​的

最快的是not all(l)not next(filterfalse(bool, it), True),这只是一个愚蠢的itertools变种。使用Jack Aidleys solution

时间码:

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