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

Fra*_*ery 60 python

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

列表可以是全部None或其中一个是re.Match实例.我可以在返回的列表上做什么内衬检查,告诉我内容全部None

Dan*_* D. 140

all(v is None for v in l)
Run Code Online (Sandbox Code Playgroud)

将返回True如果所有的元素lNone

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

  • @ s0upa1t [`all`](https://docs.python.org/2/library/functions.html#all)在找到第一个假对象时停止.第二个是至少在CPython下更快,因为`list`类型的对象上的`.count`方法是内置的并且用C语言编写,并且与生成器不同,它没有在列表中的循环中涉及解释器. (3认同)

Sve*_*ach 38

not any(my_list)
Run Code Online (Sandbox Code Playgroud)

返回True如果所有项目my_list都falsy.

编辑:由于匹配对象始终是真实的并且None是假的,这将产生与all(x is None for x in my_list)手头的情况相同的结果.正如gnibbler的回答所示,使用any()是迄今为止更快的替代方案.

  • 对于小于1的数值,这被认为是假的 (5认同)
  • @Dog:你的评论与这个问题完全无关.匹配对象评估为"True","None"评估为"False".此外,只有0被认为是假的,而不是"小于1的数值". (4认同)
  • @Sven,我的评论如何与问题无关?他询问了一个可以检测列表是否只包含 None 值的函数。您的示例将以与包含 [None, None] 的列表相同的方式处理 [0, None]。我发现我对负数有误解,我不确定我从哪里得到的! (4认同)
  • @Dog:问题清楚地解释了该列表包含`re.match()`的返回值,它们是'None`或匹配对象,所以这个解决方案对于'0`来说失败并不重要.我添加了一些解释,以使其更清楚. (2认同)
  • 重新阅读他的问题。无论是在标题还是正文中,他都明确要求“都是无”,而不是“都是假的”。 (2认同)
  • @sleepycal:我通常会尝试给出解决人们问题的答案,而不是回答他们问题的确切问题("XY问题").这个问题使得实际问题非常清楚(确定列表中的模式是否都匹配),我的答案是对该问题的简洁快速解决方案. (2认同)

Joh*_*ooy 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
Run Code Online (Sandbox Code Playgroud)


Art*_*nka 5

还是有点怪,但是:

a = [None, None, None]
set(a) == set([None])
Run Code Online (Sandbox Code Playgroud)

要么:

if [x for x in a if x]: # non empty list
    #do something   
Run Code Online (Sandbox Code Playgroud)

编辑:

def is_empty(lVals):
    if not lVals:
        return True
    for x in lVals:
        if x:
            return False
    return True
Run Code Online (Sandbox Code Playgroud)

  • 即使第一个元素不是 None ,这两个都需要遍历整个列表。 (2认同)