我有一个如下所示的列表:
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 :(得分: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 。