[Python] 如何檢查列表是否為空?


Answers

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

對於序列(字符串,列表,元組),請使用空序列為假的事實。

Yes: if not seq:
     if seq:

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

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

a = []

如何檢查a是否為空?







其他人似乎將這個問題推廣到了列表之外,所以我認為我會為很多人可能使用的不同類型的序列添加一個警告,特別是因為這是第一個針對“python測試空陣列”的谷歌命中, 。

其他方法不適用於numpy數組

您需要小心numpy數組,因為對於numpy數組而言,對list s或其他標準容器而言工作正常的其他方法會失敗。 我解釋下面的原因,但總之, 首選的方法是使用size

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

由於numpy試圖將數組轉換為一個bool s數組,並且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

如果你不確定它是一個list ,一個numpy數組還是其他的東西,你可以將這個方法與@dubiousjim給出的答案結合起來,以確保每種類型都使用正確的測試。 不是很“pythonic”,但事實證明,numpy至少在這個意義上有意打破pythonicity。

如果您需要做的不僅僅是檢查輸入是否為空,而且您正在使用索引或數學運算等其他numpy功能,則可能會更有效(當然更常見),以便將輸入強制一個numpy數組。 有幾個很好的功能可以快速完成 - 最重要的是numpy.asarray 。 這需要你的輸入,如果它已經是一個數組,則不做任何事情,或者如果它是一個列表,元組等,將你的輸入封裝到一個數組中,並且可選地將它轉換為你選擇的dtype 。 因此,只要可能,它就會很快,並且確保您只需假定輸入是一個numpy數組。 我們通常甚至只使用相同的名稱,因為轉換為數組不會超出當前scope

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

這會使x.size檢查在我看到的所有情況下x.size正常工作。




Python對於空虛的處理非常統一。 鑑於以下情況:

a = []

.
.
.

if a:
   print("List is not empty.")
else:
   print("List is empty.")

您只需使用“if”語句檢查列表a是否為空。 從我讀過的和被教過的,這是查看列表或元組是否為空的“Pythonic”方法。




帕特里克(接受)的答案是正確的: if not a:是正確的做法。 哈利Holcombe的答案是正確的,這是在PEP 8風格指南。 但是,沒有任何答案可以解釋為什麼遵循成語是一個好主意 - 即使你個人發現它對於Ruby用戶或其他任何東西都不夠明確或混淆。

Python代碼和Python社區都有很強的習慣用法。 遵循這些習慣用法,您的代碼將更易於閱讀任何經驗豐富的Python代碼。 而當你違反這些成語時,這是一個強烈的信號。

確實, if not a:不區分空列表與None ,數字0,空元組,空用戶創建的集合類型,空用戶創建的非完全集合類型或單元素NumPy數組充當具有虛假價值的標量等等。有時,明確這一點很重要。 在這種情況下,你知道你想要明確的,所以你可以測試它。 例如, if not a and a is not None:意思是“除了None以外的任何錯誤”,而if len(a) != 0:意思是“僅空序列 - 除了序列之外的任何東西都是錯誤”等等。 除了測試你想測試的東西外,這也告訴讀者這個測試很重要。

但是,如果你沒有什麼需要明確的地方, if not a:會誤導讀者。 如果沒有,你會發出一些重要的信號。 (你也許會讓代碼變得更加靈活,或者更慢,或者其他任何東西,但這一切都不那麼重要。)如果你習慣性地誤導讀者這樣做,那麼當你確實需要區分時,它會被忽視,因為你已經在你的代碼中“哭泣”了。




我已經看到下面的首選:

if not a:
    print("The list is empty or null")



以下是一些可以檢查列表是否為空的方法:

a = [] #the list

1)非常簡單的pythonic方式:

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)另一個愚蠢的做法是使用exceptioniter()

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



如果你想檢查列表是否為空;

l = []
if l:
    # do your stuff.

如果你想檢查天氣列表中的所有值是空的。

l = ["", False, 0, '', [], {}, ()]
if all(bool(x) for x in l):
    # do your stuff.

但是,對於空列表,這將是True。

def empty_list(lst):
    if len(lst) ==0:
        return false
    else:
        return all(bool(x) for x in l)

現在你可以使用:

if empty_list(lst):
    # do your stuff.



看下面在Python交互式終端上執行的代碼。

>>> a = []
>>> if a:
...     print "List is not empty";
... else:
...     print "List is empty"
... 
List is empty
>>> 
>>> a = [1, 4, 9]
>>> if a:
...     print "List is not empty";
... else:
...     print "List is empty"
... 
List is not empty
>>> 



只需使用is_empty()或者使函數如下所示: -

def is_empty(any_structure):
    if any_structure:
        print('Structure is not empty.')
        return True
    else:
        print('Structure is empty.')
        return False  

它可以用於任何數據結構,如列表,元組,字典等等。 通過這些,你可以使用is_empty(any_structure)多次調用它。




我更喜歡以下內容:

if a == []:
   print "The list is empty."

可讀,您不必擔心調用像len()這樣的函數來遍歷變量。 儘管我不完全確定BigO這種類似的東西是什麼......但是Python的速度如此之快,我懷疑它是否重要,除非是巨大的。




另一個簡單的方法可能是

a = []
if len(a) == 0:
  print("Empty")
else:
  print(" Not empty")