我想删除空子列表,某些方法失败,但其他方法都是成功的。为什么? 担心方式:
data=[[],[],[],[],[]]
for rows in data:
if len(rows)==0:
list.remove(rows)
print data
结果为[[],[]]
。这不是我期望的结果[]
正确的方法(我的朋友告诉我,谢谢他):
list = [[],[],[],[],[]]
a=list(filter(lambda x: [] != x, list))
print a
结果是我预期的空列表[]
答案 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]]