例如,如果通過以下内容:
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我在本頁上看到的所有情況下的檢查工作。