如何检查列表中的所有项目是否为None?

时间:2011-06-29 09:25:47

标签: python

In [27]: map( lambda f,p: f.match(p), list(patterns.itervalues()), vatids )
Out[27]: [None, <_sre.SRE_Match object at 0xb73bfdb0>, None]

列表可以是全部None,也可以是其中一个是re.Match实例。 我可以在返回的列表上进行哪一次班轮检查,告诉我内容都是None

6 个答案:

答案 0 :(得分:128)

all(v is None for v in l)
如果True的所有元素都是l

将返回None

请注意,l.count(None) == len(l)速度要快得多,但要求l为实际list,而不仅仅是可迭代的。

答案 1 :(得分:34)

not any(my_list)
如果True的所有项都是假的,则

返回my_list

修改:由于匹配对象始终是trucy且None是假的,因此对于手头的情况,这将给出与all(x is None for x in my_list)相同的结果。如gnibbler's answer所示,使用any()是目前为止更快的替代方案。

答案 2 :(得分:11)

由于Match对象永远不会评估为false,因此只需使用not any(L)

就可以了。
$ python -m timeit -s"L=[None,None,None]" "all( v is None for v in L )"
100000 loops, best of 3: 1.52 usec per loop
$ python -m timeit -s"L=[None,None,None]" "not any(L)"
1000000 loops, best of 3: 0.281 usec per loop

$ python -m timeit -s"L=[None,1,None]" "all( v is None for v in L )"
100000 loops, best of 3: 1.81 usec per loop
$ python -m timeit -s"L=[None,1,None]" "not any(L)"
1000000 loops, best of 3: 0.272 usec per loop

答案 3 :(得分:5)

或者有点奇怪但是:

a = [None, None, None]
set(a) == set([None])

OR:

if [x for x in a if x]: # non empty list
    #do something   

编辑:

def is_empty(lVals):
    if not lVals:
        return True
    for x in lVals:
        if x:
            return False
    return True

答案 4 :(得分:0)

is_all_none = lambda L: not len(filter(lambda e: not e is None, L))

is_all_none([None,None,'x'])
False
is_all_none([None,None,None])
True

答案 5 :(得分:0)

我设法用map提出了一种尚未给出的方法

tl; dr

def all_none(l):
    return not any(map(None.__ne__, l))

all_none([None, None, None]) # -> True
all_none([None, None, 8])    # -> False

解释

使用None.__ne__有点奇怪,乍一看。当给定的值不是None时,此方法将返回NotImplementedType对象。

您希望NotImplemented将成为False的替身,但这也是事实!这意味着在集合中使用None.__eq__将为所有内容产生真实的值。

list(map(None.__eq__, [None, None, 8]))
# -> [True, True, NotImplemented]

all(list(map(None.__eq__, [None, None, 8])))
# -> True

来自Python Docs

默认情况下,除非对象的类定义,否则将其视为true 返回False的 bool ()方法或 len ()方法 返回零

相反,None.__ne__对于任何False元素返回None,并且返回 NotImplementedType对象是否包含其他内容:

list(map(None.__ne__, [None, None, 8]))
# -> [False, False, NotImplemented]

使用此方法,您可以检查any元素是否不是None并返回True。我想将其视为2种单独的方法,以帮助进行精神否定体操。

def contains_truthy(l):
    return any(map(None.__ne__, l))

def all_none(l):
    return not contains_truthy(l)

我尚未对此进行任何基准测试,但是正如该线程中的其他人所提到的,not any将产生快速的结果。