2016-06-09 52 views
0

我有看起來像這樣的列表:刪除空條目的子列表,從列表

some_list = [['a', 'b', 'c', 'd'], ['e', 'f', 'g', 'h'], ['', '', '', '']] 

我想,在列表中刪除所有空的子列表,使產品只是

clean_list = [['a', 'b', 'c', 'd'], ['e', 'f', 'g', 'h']] 

我已經試過以下

for x in some_list: 
    if x == ['', '', '', '']: 
     some_list.remove(x) 

clean_list = filter(None, list) 

clean_list = [x for x in list if x] 

,但我不斷收到輸出與空項子列表。思考?

+0

不要使用'list'作爲變量,掩蓋內置類型。 –

回答

3

使用any() function選擇名單與非空值:

clean_list = [sublist for sublist in some_list if any(sublist)] 

any()短路;遍歷sublist中的值,只要它在該子列表中找到真(非空)字符串,就會返回True,並且在測試所有值後僅返回False,發現它們爲空。

您的x == ['', '', '', '']循環失敗,因爲您在迭代它的同時修改列表。隨着列表變短,迭代開始跳過後面的元素,因爲它們已經移動了索引,請參閱strange result when removing item from a list以獲取更多詳細信息。

filter(None, ..)嘗試失敗,因爲['', '', '', '']本身不是假值,它是一個非空列表,也有它4串。這些字符串是空的並不重要。這同樣適用於你的列表理解;在some_list中的所有列表都是非空的,因此全部都被認爲是true

+0

謝謝你的美好迴應,我從很多簡單的問題中學到了很多東西。 – Nick

+0

'filter(any,some_list)' –