python删除列表的空子列表

时间:2016-05-09 07:37:17

标签: python

我想删除空子列表,某些方法失败,但其他方法都是成功的。为什么? 担心方式:

data=[[],[],[],[],[]]
for rows in data:
    if len(rows)==0:
       list.remove(rows)
print data

结果为[[],[]]。这不是我期望的结果[]

正确的方法(我的朋友告诉我,谢谢他):

list = [[],[],[],[],[]]
a=list(filter(lambda x: [] != x, list))
print a

结果是我预期的空列表[]

2 个答案:

答案 0 :(得分:3)

避免在对列表进行更改时迭代列表:

data=[[],[],[],[],[]]
for rows in data:
    if len(rows)==0:
       data.remove(rows)
print data

而是创建一个新列表:

>>> lst = []
>>> data = [[],[],[],[1,2,3]]
>>> 
>>> for rows in data:
        if rows: #if rows is not an empty list
            lst.append(rows)


>>> lst
[[1, 2, 3]]
>>> 

与创建新对象的filter相同:

>>> lst = [[],[],[],[1,2,3],[1,],[], [4,5,6],[7]]
>>> lst = filter(list.__len__,lst)
>>> lst
[[1, 2, 3], [1], [4, 5, 6], [7]]

修改

在做了一些分析后,我得到了以下结果:

>>> import timeit
>>> timeit.timeit('filter(list.__len__, lst)', setup='lst=[[],[],[],[1,2,3],[1,],[], [4,5,6],[7]]', number=1000000)
1.03789886128774
>>>
>>> timeit.timeit('filter(lambda x:x, lst)', setup='lst=[[],[],[],[1,2,3],[1,],[], [4,5,6],[7]]', number=1000000)
1.0035609489573218
>>>
>>> timeit.timeit('filter(None, lst)', setup='lst=[[],[],[],[1,2,3],[1,],[], [4,5,6],[7]]', number=1000000)
0.4335933814062045
>>>
>>> timeit.timeit('[l for l in lst if l]', setup='lst=[[],[],[],[1,2,3],[1,],[], [4,5,6],[7]]', number=1000000)
0.41073885410420985

答案 1 :(得分:2)

>>> data=[[],[],[],[],[]]
>>> filter(lambda x:x,data)
[]

>>> data=[[],[],[],[],[1]] 
>>> filter(lambda x:x,data)
[[1]]