我有一个物品清单。我还有另一个要从该列表中删除的项目列表(原始列表的子集)。
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)
因为我的实际用例中有很多要删除的项目,所以我试图找到一种更有效的方法。
答案 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)
,其中l1
和l2
是两个列表长度。
请注意,重复帖子中的某些答案跳过了集的创建,只是直接在第二个列表中测试了成员资格。正确无误,但如果第二个列表很大(性能为O(l1*l2)
,其中l1
和l2
是两个列表长度,则对性能有严重的负面影响。因此,除非第二个列表很小,否则您肯定要先将其转换为集合。