2016-06-09 56 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)' –