Python – 如何检查列表是否为空?

例如,如果通过以下内容:

a = []

如何检查是否a为空?


答案
if not a:
  print("List is empty")

使用空列表的隐式布尔型是相当pythonic。


Pythonic的方式是从PEP 8风格指南(其中Yes表示“推荐”,No表示“不推荐”):

对于序列(字符串,列表,元组),请使用空序列为假的事实。

Yes: if not seq:
     if seq:

No:  if len(seq):
     if not len(seq):

 


其他人似乎将这个问题推广到了列表之外,所以我认为我会为很多人可能使用的不同类型的序列添加一个警告,特别是因为这是第一个针对“python测试空阵列”的谷歌命中, 。

其他方法不适用于numpy数组

你需要小心numpy数组,因为对于lists或其他标准容器来说工作正常的其他方法对于numpy数组会失败。我解释下面的原因,但总之,首选的方法是使用size

“pythonic”方式不起作用:第1部分

由于numpy试图将数组转换为一个bools 数组,并且if x试图bool一次性评估所有这些s以获得某种聚合真值,所以“pythonic”方法失败。但这没有任何意义,所以你得到一个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,即使该数组有零个元素。

numpythonic的方式

正如scipy常见问题所解释的那样,在所有你知道你有一个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

如果你不确定它是否是一个listnumpy数组或其他的,你可以将这个方法与@dubiousjim给出的答案结合起来,以确保每种类型都使用正确的测试。不是很“pythonic”,但事实证明,numpy至少在这个意义上有意打破pythonicity。

如果您需要做的不仅仅是检查输入是否为空,而且您正在使用索引或数学运算等其他numpy功能,则可能会更有效(当然更常见),以便将输入强制一个numpy数组。有几个很好的功能可以快速做到这一点 – 最重要的是numpy.asarray。这将接受你的输入,如果它已经是一个数组,则不做任何事情,或者如果它是一个列表,元组等,将你的输入封装到一个数组中,并且可选地将它转换为你选择的数组dtype。因此,只要可能,它就会很快,并且确保您只需假定输入是一个numpy数组。我们通常甚至只使用相同的名称,因为转换为数组不会超出当前范围

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

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

添加评论

友情链接:蝴蝶教程