例如,如果通过以下内容:
a= []
如何检查是否a为空?
答案if nota:
print("List is empty")
使用空列表的隐式布尔型是相当pythonic。
Pythonic的方式是从PEP 8风格指南(其中Yes表示“推荐”,No表示“不推荐”):
对于序列(字符串,列表,元组),请使用空序列为假的事实。
Yes: if notseq:
ifseq:
No: iflen(seq):
if notlen(seq):
其他人似乎将这个问题推广到了列表之外,所以我认为我会为很多人可能使用的不同类型的序列添加一个警告,特别是因为这是第一个针对“python测试空阵列”的谷歌命中, 。
其他方法不适用于numpy数组
你需要小心numpy数组,因为对于lists或其他标准容器来说工作正常的其他方法对于numpy数组会失败。我解释下面的原因,但总之,首选的方法是使用size。
“pythonic”方式不起作用:第1部分
由于numpy试图将数组转换为一个bools 数组,并且if x试图bool一次性评估所有这些s以获得某种聚合真值,所以“pythonic”方法失败。但这没有任何意义,所以你得到一个ValueError:
>>>x=numpy.array([0,1])
>>> ifx: print("x")
ValueError: Thetruth value of an arraywithmore than one elementisambiguous. Usea.any() ora.all()
“pythonic”方式不起作用:第2部分
但至少上面的情况告诉你它失败了。如果你碰巧有一个只有一个元素的numpy数组,那么这个if语句将“工作”,因为你没有得到一个错误。但是,如果这一个元素碰巧是0(或0.0,或false,…),则该if语句将错误地导致false:
>>>x=numpy.array([0,])
>>> ifx: print("x")
... else: print("No x")
Nox
但显然x存在并不是空的!这个结果不是你想要的。
使用len可以产生意想不到的结果
例如,
len(numpy.zeros((1,0)) )
返回1,即使该数组有零个元素。
numpythonic的方式
正如scipy常见问题所解释的那样,在所有你知道你有一个numpy数组的情况下,正确的方法是使用if x.size:
>>>x=numpy.array([0,1])
>>> ifx.size: print("x")x>>>x=numpy.array([0,])
>>> ifx.size: print("x")
... else: print("No x")x>>>x=numpy.zeros((1,0))
>>> ifx.size: print("x")
... else: print("No x")
Nox
如果你不确定它是否是一个listnumpy数组或其他的,你可以将这个方法与@dubiousjim给出的答案结合起来,以确保每种类型都使用正确的测试。不是很“pythonic”,但事实证明,numpy至少在这个意义上有意打破pythonicity。
如果您需要做的不仅仅是检查输入是否为空,而且您正在使用索引或数学运算等其他numpy功能,则可能会更有效(当然更常见),以便将输入强制为一个numpy数组。有几个很好的功能可以快速做到这一点 – 最重要的是numpy.asarray。这将接受你的输入,如果它已经是一个数组,则不做任何事情,或者如果它是一个列表,元组等,将你的输入封装到一个数组中,并且可选地将它转换为你选择的数组dtype。因此,只要可能,它就会很快,并且确保您只需假定输入是一个numpy数组。我们通常甚至只使用相同的名称,因为转换为数组不会超出当前范围:
x=numpy.asarray(x,dtype=numpy.double)
这将使x.size我在本页上看到的所有情况下的检查工作。