【问题标题】:Python: How to remove empty lists from a list? [duplicate]Python:如何从列表中删除空列表? [复制]
【发布时间】:2011-06-18 02:18:03
【问题描述】:

我有一个包含空列表的列表:

list1 = [[], [], [], [], [], 'text', 'text2', [], 'moreText']

如何删除空列表以便获得:

list2 = ['text', 'text2', 'moreText']

我试过 list.remove('') 但这不起作用。

【问题讨论】:

  • '' != [],这就是.remove 不起作用的原因。但这仍然是一个糟糕的解决方案(要么您事先检查是否有 [] in list1 - O(n**2) - 要么抓住它抛出的错误 - 丑陋)。
  • 太棒了,当你发现虽然你的问题并不常见,但是很久以前有人发布了它并且已经得到了很好的回答!我爱所以

标签: python list


【解决方案1】:

试试

list2 = [x for x in list1 if x != []]

如果你想摆脱所有“虚假”的东西,例如空字符串,空元组,零,你也可以使用

list2 = [x for x in list1 if x]

【讨论】:

  • +1 用于提及想到的另一种方式及其不同之处。
  • 我知道这是旧的,但我一直看到那个大括号方法,我无法通过谷歌找到任何东西(可能是因为谷歌不做标点符号)。那叫什么,这样我就可以了解更多关于那里真正发生的事情?
  • @David:List comprehensionsGenerator expressions。还有字典推导和集合推导。
【解决方案2】:

您可以使用filter() 代替列表推导:

list2 = filter(None, list1)

如果None 用作filter() 的第一个参数,它会过滤掉给定列表中的每个值,即布尔上下文中的False。这包括空列表。

它可能比列表推导略快,因为它只在 Python 中执行一个函数,其余的在 C 中完成。

【讨论】:

  • 为什么这个答案没有更多的赞成票和/或被接受的答案?
  • @MattO'Brien b/c 许多 Python 程序员避免使用 filter(),以及 lambdamap()reduce();这包括Guido himself,尽管该帖子有点旧。我倾向于更喜欢列表推导 b/c 清晰度通常比这些方法和 lambda 运算符的轻微加速更重要。话虽这么说,这个案例是微不足道的 b/c 很清楚程序员的意图是什么。
  • 在 Python3 中,我认为这必须修改为:list2 = list(filter(None, list1))。以防万一任何使用 Python3 的新手想知道为什么这对他们不起作用:)
【解决方案3】:

None 调用filter 将过滤掉列表中的所有虚假值(即空列表)

list2 = filter(None, list1)

【讨论】:

    【解决方案4】:
    >>> list1 = [[], [], [], [], [], 'text', 'text2', [], 'moreText']
    >>> list2 = [e for e in list1 if e]
    >>> list2
    ['text', 'text2', 'moreText']
    

    【讨论】:

    • 有人可以编辑这个吗!我似乎无法获得格式选项。
    • 完成(需要使用{}
    • @RC:谢谢!我知道,但由于某些奇怪的原因,它不可见(没有选项)。
    【解决方案5】:

    几个选项:

    filter(lambda x: len(x) > 0, list1)  # Doesn't work with number types
    filter(None, list1)  # Filters out int(0)
    filter(lambda x: x==0 or x, list1) # Retains int(0)
    

    示例会话:

    Python 2.7.1 (r271:86832, Nov 27 2010, 17:19:03) [MSC v.1500 64 bit (AMD64)] on
    win32
    Type "help", "copyright", "credits" or "license" for more information.
    >>> list1 = [[], [], [], [], [], 'text', 'text2', [], 'moreText']
    >>> filter(lambda x: len(x) > 0, list1)
    ['text', 'text2', 'moreText']
    >>> list2 = [[], [], [], [], [], 'text', 'text2', [], 'moreText', 0.5, 1, -1, 0]
    >>> filter(lambda x: x==0 or x, list2)
    ['text', 'text2', 'moreText', 0.5, 1, -1, 0]
    >>> filter(None, list2)
    ['text', 'text2', 'moreText', 0.5, 1, -1]
    >>>
    

    【讨论】:

    • -1: len(x) > 0 本质上与bool(x) 相同或只是x
    • +1:@RC。如果您的列表中有数字类型,则不能在其上调用 len。如果您有0,它将被None 过滤掉。否则我喜欢这个答案。
    【解决方案6】:

    我发现这个问题是因为我想做和 OP 一样的事情。 我想添加以下观察:

    迭代方式(user225312,Sven Marnach):

    list2 = [x for x in list1 if x]
    

    将在 python3python2 中返回一个 list 对象。相反,过滤器方式(lunaryorn,Imran)会在不同版本中表现不同:

    list2 = filter(None, list1)
    

    它将在python3 中返回一个filter 对象,在python2 中返回一个list(参见同时找到的this question)。这是一个细微的差别,但在开发兼容脚本时必须考虑到这一点。

    这不对这些解决方案的性能做出任何假设。无论如何,可以使用以下方法将过滤器对象恢复为列表:

    list3 = list(list2)
    

    【讨论】:

      【解决方案7】:
      a = [[1,'aa',3,12,'a','b','c','s'],[],[],[1,'aa',7,80,'d','g','f',''],[9,None,11,12,13,14,15,'k']]
      
      b=[]
      for lng in range(len(a)):
             if(len(a[lng])>=1):b.append(a[lng])
      a=b
      print(a)
      

      输出:

      [[1,'aa',3,12,'a','b','c','s'],[1,'aa',7,80,'d','g','f',''],[9,None,11,12,13,14,15,'k']]
      

      【讨论】:

      • 你在 2015 年发布了这个;在 2021 年解决我的问题之前,它的得分为零。教训:继续提供帮助。您不知道您的解决方案让谁受益最多!谢谢。加一。
      【解决方案8】:
      list1 = [[], [], [], [], [], 'text', 'text2', [], 'moreText']
      list2 = []
      for item in list1:
          if item!=[]:
              list2.append(item)
      print(list2)
      

      输出:

      ['text', 'text2', 'moreText']
      

      【讨论】:

      • 仅代码答案本身并不是很有用。如果您可以添加一些详细信息来解释它如何/为什么回答问题,那将会有所帮助。也就是说,我不确定这个答案比其他所有答案都对这个五年前的问题有什么价值。
      【解决方案9】:

      除了上面的答案,假设您有一个list of lists 的形式:

      theList = [['a','b',' '],[''],[''],['d','e','f','g'],['']]
      

      你想从每个列表中取出空条目以及你可以做的空列表:

      theList = [x for x in theList if x != ['']] #remove empty lists
      for i in range(len(theList)):
          theList[i] = list(filter(None, theList[i])) #remove empty entries from the lists
      

      您的新列表将如下所示

      theList = [['a','b'],['d','e','f','g']]
      

      【讨论】:

        猜你喜欢
        • 2018-05-03
        • 1970-01-01
        • 2017-11-02
        • 2017-03-05
        • 1970-01-01
        • 2021-05-10
        • 2012-07-11
        • 2015-09-20
        • 2021-05-19
        相关资源
        最近更新 更多