代码之家  ›  专栏  ›  技术社区  ›  Bijan

从另一个列表中删除所有项目的有效方法[复制]

  •  1
  • Bijan  · 技术社区  · 5 年前

    我有一份物品清单。我还有一个项目列表(原始列表的子集),我想从这个列表中删除。

    myitems = [1, 1, 2, 3, 3, 4, 5]
    items_to_remove = [1, 4]
    

    这个输出应该是 [2, 3, 3, 5]

    items_to_remove myitems ?

    我目前的代码是:

    for item in items_to_remove:
        myitems = list(filter((item).__ne__,myitems)
    

    1 回复  |  直到 5 年前
        1
  •  2
  •   Tom Karzes    5 年前

    s = set(items_to_remove)
    result = [x for x in myitems if x not in s]
    
    

    使用示例列表值,将生成所需的结果:

    [2, 3, 3, 5]
    

    这个解决方案有 O(l1+l2) 时间复杂性,在哪里 l1 l2 是两个列表长度。

    请注意,重复帖子中的一些答案跳过了集的创建,只是直接在第二个列表中测试成员资格。虽然正确,但如果第二个列表很大,并且性能为 O(l1*l2) l1 l2级 是两个列表长度。所以除非第二个列表非常小,否则您肯定要先将其转换为集合。