如何删除列表mg中的重复Meg对象?需保留原有读取逻辑
删除Meg对象列表中的重复实例
已知现有Python代码生成了包含重复Meg实例的列表mg,要求在不修改Meg类定义、数据读取方法及mg变量初始化逻辑的前提下,实现列表去重(重复判定标准:ss、rr、cd三个属性值完全一致)。
方法一:基于属性元组的遍历筛选
通过集合记录已出现过的对象属性组合,遍历原列表时只保留首次出现的实例:
if __name__ == '__main__': # 以下为不可修改的原有代码 lines=['842', '81 842 81', '842 81 81', '81 842 81', '842 81 81', '82 842 82', '82 842 82', '83 842 83', '842 83 83'] idd = lines[0].rstrip() mg = [] for line in lines[1:]: if not line: break ss, rr, cd = line.split( ' ') mg.append(Meg(ss,rr,cd.rstrip(),),) # 去重逻辑(新增部分) seen = set() unique_mg = [] for item in mg: # 将对象属性转为可哈希的元组作为唯一标识 attr_tuple = (item.ss, item.rr, item.cd) if attr_tuple not in seen: seen.add(attr_tuple) unique_mg.append(item) # 打印验证去重结果 for obj in unique_mg: print(f"ss={obj.ss}, rr={obj.rr}, cd={obj.cd}")
方法二:列表推导式简化实现
利用赋值表达式(Python 3.8+支持)简化代码逻辑,效果和方法一完全一致:
if __name__ == '__main__': # 不可修改的原有代码 lines=['842', '81 842 81', '842 81 81', '81 842 81', '842 81 81', '82 842 82', '82 842 82', '83 842 83', '842 83 83'] idd = lines[0].rstrip() mg = [] for line in lines[1:]: if not line: break ss, rr, cd = line.split( ' ') mg.append(Meg(ss,rr,cd.rstrip(),),) # 去重逻辑(新增部分) seen = set() unique_mg = [item for item in mg if not ((attr_tuple := (item.ss, item.rr, item.cd)) in seen or seen.add(attr_tuple))] # 验证结果 for obj in unique_mg: print(f"ss={obj.ss}, rr={obj.rr}, cd={obj.cd}")
关键说明
- 由于无法修改
Meg类,不能通过重写__eq__和__hash__方法让对象直接支持集合去重,因此通过提取属性元组的方式间接实现唯一性判断。 - 两种方法均保留了原列表中每个重复组的第一个实例,若需要保留最后一个实例,只需反向遍历原列表后再反转结果即可。
内容的提问来源于stack exchange,提问作者user10296606
相关产品推荐
相关产品推荐

