Python 如何检查列表是否为空?
例如,如果通过以下步骤:Python 如何检查列表是否为空?,python,list,Python,List,例如,如果通过以下步骤: a = [] if a == []: print "The list is empty." a = [] 如何检查a是否为空 if not a: print("List is empty") 在真值测试中,使用空的列表的方法是非常有益的。空列表本身被认为是错误的(请参阅): @达伦·托马斯 编辑:针对测试的另一点 空列表为False:那么 多态性?你不应该依赖别人 列表就是一个列表。它应该只是 像鸭子一样嘎嘎叫-你过得怎么样 让你的鸭群嘎嘎作响 没有元
a = []
if a == []:
print "The list is empty."
a = []
如何检查a
是否为空
if not a:
print("List is empty")
在真值测试中,使用空的
列表的方法是非常有益的。空列表本身被认为是错误的(请参阅):
@达伦·托马斯
编辑:针对测试的另一点
空列表为False:那么
多态性?你不应该依赖别人
列表就是一个列表。它应该只是
像鸭子一样嘎嘎叫-你过得怎么样
让你的鸭群嘎嘎作响
没有元素时为“False”
您的duckCollection应该实现\uuuuu非零\uuuuuuu
或\uuuu len\uuuuuuu
,因此if a:将毫无问题地工作。我更喜欢以下选项:
a = []
if a == []:
print "The list is empty."
a = []
python的方法是从(其中Yes表示“推荐”,而No表示“不推荐”):
对于序列(字符串、列表、元组),使用空序列为false这一事实。
<代码>是:如果不是,则如下:
如果如下所示:
否:如果长度(序号):
如果不是len(序号):
对于Python列表、字符串、dict和集合。Python在内部跟踪这些容器中的元素数量
JavaScript。我更喜欢它:
if len(li) == 0:
print('the list is empty')
通过这种方式,li
是一个序列(列表),这是100%清楚的,我们想要测试它的大小。我对if not li:…
的问题是,它给人一种错误的印象,认为li
是一个布尔变量。这是谷歌首次在“python测试空数组”和类似查询中大放异彩,加上其他人似乎把这个问题推广到了列表之外,所以我想我应该为很多人可能使用的不同类型的序列添加一个警告
其他方法不适用于NumPy数组
您需要小心使用NumPy数组,因为其他适用于list
s或其他标准容器的方法无法适用于NumPy数组。我将在下面解释原因,但简而言之,问题是使用size
“pythonic”方法不起作用:第1部分
对于NumPy数组,“pythonic”方法失败,因为NumPy尝试将数组强制转换为bool
s的数组,并且如果x
尝试一次计算所有这些bool
s的某种聚合真值。但这没有任何意义,因此您会得到一个ValueError
:
>>> x = numpy.array([0,1])
>>> if x: print("x")
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
“pythonic”方法不起作用:第2部分
但至少上面的案例告诉你它失败了。如果恰好有一个NumPy数组,其中正好有一个元素,If
语句将“起作用”,即不会出现错误。但是,如果一个元素恰好是0
(或0.0
,或False
,…),则if
语句将错误地导致False
:
>>> x = numpy.array([0,])
>>> if x: print("x")
... else: print("No x")
No x
但是很明显,x
存在并且不是空的!这个结果不是你想要的
使用len
可能会产生意外的结果
比如说,
len( numpy.zeros((1,0)) )
返回1,即使数组有零个元素
音速方式
如中所述,在您知道您有一个NumPy数组的所有情况下,正确的方法是使用if x.size
:
>>> x = numpy.array([0,1])
>>> if x.size: print("x")
x
>>> x = numpy.array([0,])
>>> if x.size: print("x")
... else: print("No x")
x
>>> x = numpy.zeros((1,0))
>>> if x.size: print("x")
... else: print("No x")
No x
如果您不确定它可能是一个列表
、一个NumPy数组还是其他什么,您可以将此方法与相结合,以确保对每种类型使用正确的测试。不是很“pythonic”,但事实证明NumPy至少在这个意义上故意打破了pythonicity
如果您需要做的不仅仅是检查输入是否为空,而且您正在使用其他NumPy功能,如索引或数学操作,那么强制输入为NumPy数组可能更有效(当然也更常见)。最重要的是,有一些很好的函数可以快速实现这一点。这将接收您的输入,如果它已经是一个数组,则不执行任何操作;如果它是一个列表、元组等,则将您的输入包装到一个数组中,并可选地将其转换为您选择的dtype
。因此,无论何时,它都非常快速,并且它确保您只需假设输入是一个NumPy数组。我们通常甚至只使用相同的名称,因为转换为数组不会使其回到当前名称之外:
这将使x.size
检查在我在本页上看到的所有情况下都有效。我写过:
if isinstance(a, (list, some, other, types, i, accept)) and not a:
do_stuff
投票结果为-1。我不确定这是否是因为读者反对这一策略,或者认为给出的答案没有帮助。我会假装是后者,因为——不管算什么“蟒蛇式”——这是正确的策略。除非您已经排除,或者准备处理a
为假的情况,例如False
,否则您需要一个比如果不是a:
更严格的测试。您可以使用以下内容:
if isinstance(a, numpy.ndarray) and not a.size:
do_stuff
elif isinstance(a, collections.Sized) and not a:
do_stuff
第一个测试是对上面@Mike的答案的回应。第三行也可以替换为:
elif isinstance(a, (list, tuple)) and not a:
如果只希望接受特定类型(及其子类型)的实例,或使用:
elif isinstance(a, (list, tuple)) and not len(a):
您可以不进行显式类型检查,但前提是周围的上下文已经确保a
是您准备处理的类型的值,或者您确定您不准备处理的类型将引发错误(例如,TypeError
,如果您对未定义的值调用len
),则为您准备处理的值。通常,“pythonic”惯例似乎走到了最后。像鸭子一样挤压它,如果它不知道如何嘎嘎叫,就让它引发一个DuckError。不过,你仍然需要考虑你正在做的是什么类型的假设,以及你没有准备好正确处理的情况是否真的会在正确的地方出错。Numpy数组就是一个很好的例子我们只是盲目地依赖于len
或布尔类型转换可能无法实现您的期望。是正确的:如果不是:
就是正确的方法。这在PEP 8样式指南中是正确的。但是什么呢
if not a:
print('"a" is empty!')
def list_test (L):
if L is None : print('list is None')
elif not L : print('list is empty')
else: print('list has %d elements' % len(L))
list_test(None)
list_test([])
list_test([1,2,3])
list is None
list is empty
list has 3 elements
def list_test2 (L):
if not L : print('list is empty')
else: print('list has %d elements' % len(L))
list_test2(None)
list_test2([])
list_test2([1,2,3])
list is empty
list is empty
list has 3 elements
a = [1,2,3];
print bool(a); # it will return True
a = [];
print bool(a); # it will return False
a = [] #the list
if not a:
print("a is empty")
if len(a) == 0:
print("a is empty")
if a == []:
print("a is empty")
try:
next(iter(a))
# list has elements
except StopIteration:
print("Error: a is empty")
import collections
def is_empty(a):
return not a and isinstance(a, collections.Iterable)
>>> is_empty('sss')
False
>>> is_empty(555)
False
>>> is_empty(0)
False
>>> is_empty('')
True
>>> is_empty([3])
False
>>> is_empty([])
True
>>> is_empty({})
True
>>> is_empty(())
True
a = []
if not a: # do this!
print('a is an empty list')
Yes: if not seq:
if seq:
No: if len(seq):
if not len(seq):
if len(a) == 0: # Don't do this!
print('a is an empty list')
if a == []: # Don't do this!
print('a is an empty list')
if len(a) == 0: # Don't do this!
print('a is an empty list')
if a == []: # Don't do this!
print('a is an empty list')
if not a:
print('a is an empty list')
>>> import timeit
>>> min(timeit.repeat(lambda: len([]) == 0, repeat=100))
0.13775854044661884
>>> min(timeit.repeat(lambda: [] == [], repeat=100))
0.0984637276455409
>>> min(timeit.repeat(lambda: not [], repeat=100))
0.07878462291455435
>>> min(timeit.repeat(lambda: [], repeat=100))
0.07074015751817342
>>> import dis
>>> dis.dis(lambda: len([]) == 0)
1 0 LOAD_GLOBAL 0 (len)
2 BUILD_LIST 0
4 CALL_FUNCTION 1
6 LOAD_CONST 1 (0)
8 COMPARE_OP 2 (==)
10 RETURN_VALUE
>>> dis.dis(lambda: [] == [])
1 0 BUILD_LIST 0
2 BUILD_LIST 0
4 COMPARE_OP 2 (==)
6 RETURN_VALUE
>>> dis.dis(lambda: not [])
1 0 BUILD_LIST 0
2 UNARY_NOT
4 RETURN_VALUE
typedef struct {
PyObject_VAR_HEAD
/* Vector of pointers to list elements. list[0] is ob_item[0], etc. */
PyObject **ob_item;
/* ob_item contains space for 'allocated' elements. The number
* currently in use is ob_size.
* Invariants:
* 0 <= ob_size <= allocated
* len(list) == ob_size
In [1]: l = []
In [2]: %timeit l
20 ns ± 0.155 ns per loop (mean ± std. dev. of 7 runs, 100000000 loops each)
In [3]: %timeit not l
24.4 ns ± 1.58 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
In [4]: %timeit not not l
30.1 ns ± 2.16 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
def is_empty(any_structure):
if any_structure:
print('Structure is not empty.')
return True
else:
print('Structure is empty.')
return False
l = []
if l:
# do your stuff.
l = ["", False, 0, '', [], {}, ()]
if all(bool(x) for x in l):
# do your stuff.
def empty_list(lst):
if len(lst) == 0:
return False
else:
return all(bool(x) for x in l)
if empty_list(lst):
# do your stuff.
if len(a) == 0:
print("a is empty")
not a
if isinstance(a, list) and len(a)==0:
print("Received an empty list")
print('not empty' if a else 'empty')
a.pop() if a else None
if a: a.pop()
a == []
def enquiry(list1):
if len(list1) == 0:
return 0
else:
return 1
# ––––––––––––––––––––––––––––––––
list1 = []
if enquiry(list1):
print ("The list isn't empty")
else:
print("The list is Empty")
# Result: "The list is Empty".
def enquiry(list1):
if not list1:
return True
else:
return False
# ––––––––––––––––––––––––––––––––
list1 = []
if enquiry(list1):
print ("The list is Empty")
else:
print ("The list isn't empty")
# Result: "The list is Empty"
if not a :
print ("Empty")
if len(a) == 0 :
print( "Empty" )
if a == [] :
print ("Empty")
foo = itertools.takewhile(is_not_empty, (f(x) for x in itertools.count(1)))
foo = itertools.takewhile(bool, (f(x) for x in itertools.count(1)))