例如,如果通过以下步骤:

a = []

如何检查a是否为空?


当前回答

以下是检查列表是否为空的几种方法:

a = [] #the list

1) 非常简单的蟒蛇方式:

if not a:
    print("a is empty")

在Python中,空容器(如列表、元组、集合、字典、变量等)被视为False。可以简单地将列表视为谓词(返回布尔值)。True值表示它为非空。

2) 一种非常明确的方法:使用len()查找长度并检查它是否等于0:

if len(a) == 0:
    print("a is empty")

3) 或者将其与匿名空列表进行比较:

if a == []:
    print("a is empty")

4) 另一种愚蠢的方法是使用exception和iter():

try:
    next(iter(a))
    # list has elements
except StopIteration:
    print("Error: a is empty")

其他回答

来自真实值测试的文档:

此处列出的值以外的所有值均视为True

没有一个错误任何数字类型的零,例如0、0.0、0j。任何空序列,例如“”、()、[]。任何空映射,例如{}。如果类定义了__bool_()或__len__()方法,则该方法返回整数零或布尔值False。

可以看出,空列表[]是错误的,因此对布尔值执行操作听起来最有效:

if not a:
    print('"a" is empty!')

这是谷歌对“python测试空数组”和类似查询的第一次点击,其他人将这个问题概括为列表之外的问题,所以这里有很多人使用的不同类型的序列的警告。

其他方法不适用于NumPy数组

您需要小心使用NumPy数组,因为对于列表或其他标准容器工作正常的其他方法对于NumPy阵列失败。我在下面解释了原因,但简而言之,首选的方法是使用大小。

“蟒蛇”的方式行不通:第一部分

NumPy数组的“pythonic”方法失败,因为NumPy试图将数组强制转换为布尔值数组,如果x试图同时计算所有布尔值以获得某种聚合真值。但这没有任何意义,因此您会得到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()

“蟒蛇”的方式行不通:第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,即使数组没有元素。

numpythonic方式

正如SciPy常见问题解答中所解释的,在所有已知拥有NumPy数组的情况下,正确的方法是在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数组还是其他类型,可以将此方法与@dubiusjim给出的答案结合起来,以确保对每种类型使用正确的测试。不是很“蟒蛇”,但事实证明NumPy至少在这个意义上故意破坏了蟒蛇。

如果您需要做的不仅仅是检查输入是否为空,而且您正在使用其他NumPy特性,如索引或数学运算,那么强制输入为NumPy数组可能更有效(当然也更常见)。有几个很好的函数可以快速实现这一点,最重要的是numpy.asarray。它接受您的输入,如果它已经是一个数组,则不执行任何操作,如果它是一个列表、元组等,则将您的输入包装到一个数组中,并可选地将其转换为您选择的数据类型。因此,无论何时,它都非常快速,并确保您只需假设输入是一个NumPy数组。我们通常甚至只使用相同的名称,因为转换到数组不会使其返回到当前范围之外:

x = numpy.asarray(x, dtype=numpy.double)

这将使x.size检查在我在本页上看到的所有情况下都有效。

让我来到这里的是一个特殊的用例:我实际上想要一个函数来告诉我列表是否为空。我想避免在这里编写自己的函数或使用lambda表达式(因为它看起来应该足够简单):

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)))

当然,不要在if(即if bool(L):)中使用bool,因为它是隐含的。但是,对于明确需要“不为空”作为函数的情况,bool是最佳选择。

受到dubiusjim解决方案的启发,我建议使用一个额外的常规检查,看看它是否可以迭代:

import collections
def is_empty(a):
    return not a and isinstance(a, collections.Iterable)

注意:如果希望排除空字符串,则字符串被认为是可迭代的add,而不是isinstance(a,(str,unicode))

测试:

>>> 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

我们可以使用一个简单的if else:

item_list=[]
if len(item_list) == 0:
    print("list is empty")
else:
    print("list is not empty")