【问题标题】:How to remove all occurrences of an element from list in Python?如何从 Python 列表中删除所有出现的元素?
【发布时间】:2020-03-17 16:08:48
【问题描述】:
ls = [[1], [1, 2], [1, 2, 3], [], [2], [2, 3], [], [], [3]]

是否有任何 python 列表方法可以让我一次删除所有类似的项目。例如,我有一个二维列表“ls”,其中包含三个空列表项 []。我想一次删除所有空列表项。 我知道它可以通过“删除”和“循环”来完成。但是有什么方法可以立即进行操作吗? 简单地说:我希望删除所有的“[]”。因此答案将是这样的。 [[1], [1, 2], [1, 2, 3], [2], [2, 3], [3]]

【问题讨论】:

  • 您可以使用set(ls) 来消除重复条目。但这会将列表转换为集合。
  • 设置就是答案..
  • 您想只删除重复项还是同时删除原始项?换句话说,您要删除三个 1 还是只删除两个?
  • @amanb 是的,设置确实有效。 list(set(ls)) 也将使集合再次列出。但我正在使用二维列表。所以 set 对我不起作用。
  • @Saykat,好的。要求还不清楚。请同时更新问题。

标签: python python-3.x list filter


【解决方案1】:

没有remove_all 方法或类似的方法,但最好的方法是使用列表解析或filter

假设ls 仅包含其他列表,您可以编写以下内容以删除所有出现的空列表[]

列表理解

ls = [[1], [1, 2], [1, 2, 3], [], [2], [2, 3], [], [], [3]]
ls = [x for x in ls if x]
# now ls =  [[1], [1, 2], [1, 2, 3], [2], [2, 3], [3]]

过滤器

ls = [[1], [1, 2], [1, 2, 3], [], [2], [2, 3], [], [], [3]]
ls = list(filter(None, ls))
# now ls =  [[1], [1, 2], [1, 2, 3], [2], [2, 3], [3]]

泛化不仅仅是空列表

如果您想删除所有出现的给定元素elem(即不是空列表),您可以将上述代码修改如下:

ls = [x for x in ls if x != elem]

##### or #####

ls = list(filter(lambda x: x != elem, ls))

【讨论】:

  • 是的,您可以用您想要删除的任何其他值替换 1。但正如问题的措辞,期望的行为是删除所有出现的一个元素。
  • 我已经更新了答案以反映问题的变化
  • 如果你有类似的元素像[[2, 2,2], [2,2,2], [3,3,3], [3,3,3]] ?
  • @kederrac 虽然问题的标题可能具有误导性,但问题是要删除所有出现的特定元素,在本例中是所有出现的 []。我将更新我的答案以显示如何删除任何给定元素的所有出现。
【解决方案2】:

集合对象是不同的可散列对象的无序集合。常见用途包括成员资格测试、从序列中删除重复项以及计算数学运算,例如交集、并集、差分和对称差分。 (对于其他容器,请参阅内置的 dict、list 和 tuple 类以及集合模块。)

https://docs.python.org/3.8/library/stdtypes.html#set-types-set-frozenset

【讨论】:

    【解决方案3】:

    你可以做这样的事情。但它是针对这种情况的:

    ls = [[1], [1, 2], [1, 2, 3], [], [2], [2, 3], [], [], [3]]
    [l for l in ls if len(l)!=0]
    

    【讨论】:

    • 请看这个answerif len(l)!=0 不推荐也不应该这样做。
    【解决方案4】:

    您可以在此处使用filter 删除所有[] 列表并保持顺序。

    list(filter(None,ls))
    # [[1], [1, 2], [1, 2, 3], [2], [2, 3], [3]]
    

    上面的列表理解是

    [lst for lst in ls if lst]
    # [[1], [1, 2], [1, 2, 3], [2], [2, 3], [3]]
    

    【讨论】:

      【解决方案5】:

      您可以尝试以下方法:

      1)

      l = [x for x in ls if x != []]
      

      l = [x for x in ls if x]
      

      2)

      l = filter(None, ls)
      

      【讨论】:

        【解决方案6】:

        您可以将collections.Counter 与内置函数filter 一起使用:

        from collections import Counter
        
        count = Counter(map(str, ls))
        ls = list(filter(lambda x: count[str(x)] == 1, ls))
        ls
        

        输出:

        [[1], [1, 2], [1, 2, 3], [2], [2, 3], [3]]
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-04-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-06-16
          • 2017-12-28
          • 2011-01-12
          • 1970-01-01
          相关资源
          最近更新 更多