天天看點

python判斷一個清單是否為空_Python – 如何檢查清單是否為空?

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

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我在本頁上看到的所有情況下的檢查工作。