Python如何根据对象属性值删除列表中的指定对象
Python实现:移除列表中指定属性符合条件的自定义类实例
问题场景
现有自定义类MyClass,以及存储其实例的列表myList,相关定义如下:
class MyClass(): def __init__(self, name, att1, att2): self.name = name self.att1 = att1 self.att2 = att2 myList = [MyClass("p1", 1, 1), MyClass("p2", 0, 0), MyClass("p3", 0, 1)]
需要移除列表中所有满足att2 == 1条件的实例。
推荐实现方案
- 列表推导式(优先选用)
这是最简洁、可读性最高、执行效率最优的方案,直接通过过滤条件生成新列表覆盖原变量即可,不会出现遍历过程中动态修改列表导致的索引错位问题:
myList = [obj for obj in myList if obj.att2 != 1]
- 原地修改原列表(适配需要保留原列表引用的场景)
如果有其他变量已经绑定了myList的引用,不能替换成新列表对象,可以用以下两种方式原地修改:
# 方式A:切片赋值,把过滤后的内容直接写入原列表内存空间 myList[:] = [obj for obj in myList if obj.att2 != 1] # 方式B:倒序遍历删除,避免正序删除时元素前移导致的漏删问题 for idx in range(len(myList) - 1, -1, -1): if myList[idx].att2 == 1: del myList[idx]
避坑提醒
禁止直接正序遍历原列表同时执行删除操作,这种写法会因为列表长度动态收缩、元素索引前移,漏删部分符合条件的元素,属于常见低级错误:
# 错误写法示例,会漏删元素 for obj in myList: if obj.att2 == 1: myList.remove(obj)
结果验证
过滤完成后遍历列表打印实例名称,可验证只剩符合条件的p2实例:
for item in myList: print(item.name) # 输出:p2
内容的提问来源于stack exchange,提问作者ChrisLearnsCoding
相关产品推荐
相关产品推荐

