从其他列表中删除所有项目的有效方法

时间:2020-09-15 20:20:30

标签: python list

我有一个物品清单。我还有另一个要从该列表中删除的项目列表(原始列表的子集)。

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

此输出应为[2, 3, 3, 5]

items_to_removemyitems的所有项目最有效的方式是什么?

我当前的代码是:

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

因为我的实际用例中有很多要删除的项目,所以我试图找到一种更有效的方法。

1 个答案:

答案 0 :(得分:2)

最有效的方法是创建一组要删除的项目,然后使用该集合过滤第一个列表:

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

使用样本列表值,将产生所需的结果:

[2, 3, 3, 5]

此解决方案的时间复杂度为O(l1+l2),其中l1l2是两个列表长度。

请注意,重复帖子中的某些答案跳过了集的创建,只是直接在第二个列表中测试了成员资格。正确无误,但如果第二个列表很大(性能为O(l1*l2),其中l1l2是两个列表长度,则对性能有严重的负面影响。因此,除非第二个列表很小,否则您肯定要先将其转换为集合。

相关问题