从列表中删除空条目的子列表

时间:2016-06-09 22:08:03

标签: python list python-2.7

我有一个如下所示的列表:

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]

但我不断获得带有空条目的子列表的输出。想法?

1 个答案:

答案 0 :(得分: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