如何根据另一个列表中的ID删除列表中的对象?
这其实是Python里很常见的对象过滤场景,我给你几种实用的实现方式,都能完美解决你的需求:
方法1:列表推导式(推荐,简洁又高效)
首先建议把ID_list转换成集合——因为集合的成员检查速度比列表快得多,尤其是当ID数量较多的时候,能大幅提升效率。然后用列表推导式生成新的过滤后的列表:
# 先把ID列表转成集合,优化查找效率 ID_set = set(ID_list) # 生成新列表,只保留ID不在目标集合里的对象 Obj_list = [obj for obj in Obj_list if obj.ID not in ID_set]
针对你的示例场景:ID_list = [45,56,78,11],Obj_list里的x1.ID=45(在集合中)会被过滤掉,x2.ID=46不在集合里会被保留,最终Obj_list就只剩[Node.node at x2],完全符合预期。
方法2:原地修改原列表(适合不想创建新列表的场景)
如果你不想生成新列表,想直接在原列表上删除元素,记得要从后往前遍历——因为如果正向遍历的话,删除元素会导致列表长度变化,后面的元素索引错位,容易漏删或者报错:
ID_set = set(ID_list) # 反向遍历原列表 for obj in reversed(Obj_list): if obj.ID in ID_set: Obj_list.remove(obj)
这种方式会直接修改原Obj_list,最终效果和方法1一致。
小提示
不管用哪种方法,都优先把ID_list转成集合,因为obj.ID in ID_set的时间复杂度是O(1),而obj.ID in ID_list是O(n),当ID数量多的时候,性能差距会非常明显。
内容的提问来源于stack exchange,提问作者Erri000
相关产品推荐
相关产品推荐

