2015-03-31 64 views
0

下午好!亲爱的同事!我可能有一个很明显的问题,但对我来说,这可能被认为是一个谜。Python。如何有效地从阵列中删除自定义对象

所以,我有两个自定义类,让它成为A类和B类.B类有一个属性,它包含多个A类实例。它还包含使用此属性的方法:add,remove,get此属性中的单个和所有实例。但是,除了标准的和相当有争议的MVC模式处理,我想知道:什么是最有效和最快速的方法来从Python中的这个属性(数组)中移除一个对象,它实现了一些定制(比如比较对象由id,标题和其他属性)。

我已经实现了我自己的,但对于这样一个基本操作来说似乎太复杂了。

class Skill: 

    def __init__(self, id_): 
     self.id = id_ 

class Unit: 

    def __init__(self): 
     self.skills = [] 

    def get_skills(self): 
     return self.skills 

    def get_skill(self, index): 
     return self.skills[index] 

    def add_skill(self, skill): 
     self.skills.append(skill) 

    def remove_skill(self, skill_to_remove): 
     self.skills = filter(lambda skill: skill.id != skill_to_remove.id, self.skills) 

回答

0

如果您需要任意标准,那么过滤是可以的,但使用列表理解的时间稍短。例如,而不是

self.skills = filter(lambda skill: skill.id != skill_to_remove.id, self.skills) 

使用:

self.skills[:] = (s for s in self.skills if s.id != skill_to_remove.id) 

如果你过滤:

self.skills = [s for s in self.skills if s.id != skill_to_remove.id] 

它也可以修改就地列表使用切片分配(见this question)基于与“模板”技能完全匹配的技能,即匹配skill_to_remove的所有属性,则可能会更好地为您的Skill类实施平等方法(见this question)。然后你可以在self.skills上使用remove方法。但是,这只会删除第一个匹配的实例。

+0

非常感谢您的协助!这解决了我的一些犹豫;) – 2015-03-31 13:56:41

+0

很高兴它帮助 - 请考虑接受我的答案使用左侧的“打勾”按钮! ;-) – DNA 2015-03-31 14:28:18

相关问题