【问题标题】:how do you remove a list from another list? [duplicate]你如何从另一个列表中删除一个列表? [复制]
【发布时间】:2016-09-08 11:13:09
【问题描述】:

我有类似的东西:

a = [4,3,1,6,3,5,3]
b = [4,2,6]

我想从 a 中删除 b 的 3 个元素。我试图这样做:

c = a - b

但我认为合并的逆 (+) 可能不是一个东西,并且是正确的:不支持的操作数类型为 -:列表和列表。我正在考虑只是循环遍历它们,但这听起来并不像 pythony。

我的最终状态将是:c = [3,1,3,5,3]

如果您没有注意到,b 不是 a 的子集,它们是无序的。 2 个不同的集合,这些集合也不是唯一的,但只想删除每个 i in b 的 1 个实例,而不是 i in b 的所有实例

编辑目前的答案似乎无法解决我的问题。

a = [1,1,2,2,2,3,4,5]
b = [1,3]
c = [x for x in a if x not in b]
#c result is [2,2,2,4,5]

我要 c 返回:[1,2,2,2,4,5]

为了快速打字,我只是输入了排序后的数字,但列表实际上是未排序的,尽管为了清洁起见,我们可以对它们进行排序。

它们只是在初始化时未排序。 由于列表项中有重复项,我不能按照集合的定义使用集合。

【问题讨论】:

  • 这些是集合还是列表?
  • 列表,对不起,用词错误
  • 你最后一段不清楚。如果4 在列表b 中有两个4 在列表a 中出现,您是要删除其中一个4 还是所有4 a?
  • 记录在案 重复的不是正确答案,ysearka 的也不是..... DAX 给了我正确的答案,因为我只想删除一个特定的数字实例,而不是特定类型的所有

标签: python python-2.7


【解决方案1】:
for x in b:
    while x in a:
        a.remove(x)

现在a

[3, 1, 3, 5, 3]

【讨论】:

    【解决方案2】:

    您可以使用以下代码:

    [x for x in a if x not in b]
    

    【讨论】:

    • 这就是我的想法,但无法理解。出于某种原因,我一直在尝试利用列表上的按位运算。
    • @Fallenreaper:“但只想删除 b 中每个 i 的 1 个实例,而不是 b 中 i 的所有实例”-> 如果这是一个有效的答案,请调整您的问题,因为目前是您的最后一个段落与这个答案冲突......
    • @DAXaholic 实际上你是对的。我运行了代码片段,发现这不是答案。
    【解决方案3】:

    由于输入和输出列表是无序的,使用Counter 是一种方法:

    from collections import Counter
    
    a = [4,3,1,6,3,5,3]
    b = [4,2,6]
    c = list((Counter(a) - Counter(b)).elements())
    
    print(c)
    

    此解决方案处理以下情况的方式与 ysearka answer 不同:

    a = [4,3,1,6,3,5,3]
    b = [3]
    

    这里的许多答案导致c = [4,1,6,5],使用计数器的答案将输出c = [4,1,6,3,3,5]

    DAXaholic answer 也实现了此行为,但修改了现有列表,这不是 Python 的方式,并且在大型列表上可能代价高昂。

    【讨论】:

      【解决方案4】:

      正如您所说,您只想每次出现一次删除项目:

      for x in [tmp for tmp in b if tmp in a]:
              a.remove(x)
      

      【讨论】:

      • 是否可以不覆盖 a 而只是分配给一个新变量?就像:c = [x for x in a]\n for x in [tmp for tmp in b if tmp in c]: c.remove(x)
      • 你可以使用例如aluriak 的答案有几行但不会改变你的列表。
      猜你喜欢
      • 2011-01-31
      • 1970-01-01
      • 1970-01-01
      • 2017-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多