【问题标题】:python delete empty sub lists of list [duplicate]python删除列表的空子列表[重复]
【发布时间】:2016-05-09 07:37:17
【问题描述】:

我想删除空子列表,有的方法失败了,有的方法成功了。为什么 ? 担心的方式:

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

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

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

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

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

【问题讨论】:

  • 这是因为您正在遍历更改大小的列表。我很惊讶您没有收到第一个代码的错误
  • Whitefret 是正确的。在从列表中删除项目时迭代列表通常是一个坏主意。
  • @Whitefret python 的列表迭代器基本上是一个递增索引,直到引发 IndexError。这也解释了观察到的结果以及为什么没有引发错误。但这并不意味着人们应该依赖这种行为......
  • @IljaEverilä 感谢您的精确!

标签: python


【解决方案1】:

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

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

【讨论】:

  • 您可以将循环转换为列表理解:lst = [rows for rows in data if rows]
  • @ByteCommander .. 正确我们可以这样做...
【解决方案2】:
>>> data=[[],[],[],[],[]]
>>> filter(lambda x:x,data)
[]

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

【讨论】:

  • 您也可以将None 作为第一个参数传递给filter 内置函数,而不是lambda x:x,以实现相同的效果,即如果转换为布尔值,则等于False 的元素(如无,0 , False, 空集合, 空字符串, ...) 被过滤掉。
  • 谢谢。存在这个问题,改成filter(lambda x:len(x), data)
猜你喜欢
  • 1970-01-01
  • 2014-07-14
  • 1970-01-01
  • 1970-01-01
  • 2012-07-11
  • 2018-05-13
  • 1970-01-01
  • 2017-11-02
  • 2011-06-18
相关资源
最近更新 更多