2010-08-27 85 views
13
l=[None,None] 

是否有函数检查列表l是否只包含None或不包含?如何检查列表中是否只包含无python

+0

什么它应该返回空列表[[]'? – Constantin 2010-08-27 12:07:45

+1

[如何检查列表中的所有项目是否都是?]的可能重复(http://stackoverflow.com/questions/6518394/how-to-check-if-all-items-in-the-list-are - 无) – 2011-06-30 05:17:50

+0

可能的重复[最简洁的方式来检查列表是否为空或\ [无\]?](http://stackoverflow.com/questions/1270920/most-concise-way-to-check-whether -a-list-is-empty-or-none) – ThiefMaster 2012-06-09 00:56:17

回答

24

如果你的意思是,检查列表l只包含无,

if all(x is None for x in l): 
    ... 
+0

“...仅包含无”OR为空。 – Constantin 2010-08-27 12:16:32

+0

@system:为什么不呢? – kennytm 2010-08-27 12:19:55

+0

@systempuntoout,这实际上是一个生成器表达式。 – Constantin 2010-08-27 12:20:36

8

尝试any() - 它检查列表中是否有单个元素在布尔上下文中被认为是TrueNone在布尔上下文中计算为False,因此any(l)变为False

请注意,要检查列表(而不是其内容)是否真的是None,则必须使用if l is None。和if not l检查它是否是无(或其他任何被认为是False)或空。

+0

>>> any([None,None,0]) 将给出错误 – 2011-06-29 10:31:51

+0

我怎么没有听说过任何()?这个问题呢?惊人。 – otocan 2017-04-06 09:03:37

19
L == [None] * len(L) 

比使用更快的所有()当L 所有无

$ python -m timeit -s'L=[None]*1000' 'all(x is None for x in L)' 
1000 loops, best of 3: 276 usec per loop 
$ python -m timeit -s'L=[None]*1000' 'L==[None]*len(L)' 
10000 loops, best of 3: 34.2 usec per loop 
0

如果你想检查列表中的成员是否为None,那么你可以遍历这些项目并检查它们是否为无

如果你想检查列表本身是没有,你可以使用类型(varlist中),它会返回None

你可以做

如果(LST ==无): ...打印“是”

有效。

2

我个人更喜欢做一个set,然后验证它是否等于一组具有一个元素None

set(l) == {None} 

assert set([None, None, None]) == {None} 
assert set([None, 2, None]) != {None} 

不是最快的,但仍比all(...)实现更快:

$ python -m timeit -s'L=[None]*1000' 'all(x is None for x in L)' 
10000 loops, best of 3: 59 usec per loop 
$ python -m timeit -s'L=[None]*1000' 'set(L)=={None}' 
100000 loops, best of 3: 17.7 usec per loop 
$ python -m timeit -s'L=[None]*1000' 'L==[None]*len(L)' 
100000 loops, best of 3: 7.17 usec per loop 
+0

感谢@JohnLaRooy的基准代码 – 2016-07-28 18:55:17

相关问题