如何用Python结合libSBML移除SBML文件中Group的ListOfMembers成员
问题:SBML Group成员无法被实际移除
尝试删除SBML文件中的部分物种,并将这些物种ID存入removed_species集合后,运行以下代码移除Group内对应的成员:
plugin = model.getPlugin("groups") if plugin is not None: for group in plugin.getListOfGroups(): num = group.getNumMembers() for member in group.getListOfMembers(): if member.getIdRef() in removed_species: print("Member removed from group", group.getId(), member.getIdRef()) group.removeMember(member.getIdRef()) if group.getNumMembers() == num: print("No member removed from group", group.getId())
程序运行时,循环内重复输出“已移除成员”的提示,但最终Group的成员数量并未减少,输出如下:
Member removed from group Sos_471_0_ Sos_dot_Ras_GEF_cplx_486_0_ Member removed from group Sos_471_0_ Sos_dot_Ras_GEF_cplx_486_0_ No member removed from group Sos_471_0_ No member removed from group Ras_548_0_ Member removed from group EGFR_560_0_ phosph_Shc_cplx_575_0_ Member removed from group EGFR_560_0_ phosph_Shc_cplx_575_0_ No member removed from group EGFR_560_0_
解决方案
问题根源是在遍历getListOfMembers()返回的集合时直接修改原集合,迭代器会因为集合元素的删除出现异常,导致删除操作没有实际生效,甚至重复处理同一个元素。
解决方法是先将成员集合转换为一个独立的列表副本,再遍历这个副本进行删除操作:
plugin = model.getPlugin("groups") if plugin is not None: for group in plugin.getListOfGroups(): num = group.getNumMembers() # 转换为列表副本,避免遍历原集合时修改导致的问题 for member in list(group.getListOfMembers()): member_id = member.getIdRef() if member_id in removed_species: print("Member removed from group", group.getId(), member_id) group.removeMember(member_id) if group.getNumMembers() == num: print("No member removed from group", group.getId())
这样遍历的是原成员集合的快照,删除操作不会影响迭代过程,能确保符合条件的成员被正确移除。
内容的提问来源于stack exchange,提问作者Clément Raspail
相关产品推荐
相关产品推荐

