蟒蛇。如何从数组中有效地删除自定义对象

时间:2015-03-31 09:37:17

标签: python

亲爱的同事们,下午好!我可能有一个非常明显的问题,但对我来说这可能被视为一个谜。

所以,我有两个自定义类,让它成为A类和B类.B类有一个属性,它包含多个A类实例。它还包含使用这个属性的方法:add,remove,get single以及此属性中的所有实例。

然而,除了标准和相当质疑的处理MVC模式之外,我想知道:在Python中从这个属性(数组)中删除对象的最有效和最快速的方法是什么,它实现了一些自定义(例如,通过id,title和其他属性)。

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

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)

1 个答案:

答案 0 :(得分:1)

如果您需要任意标准,那么过滤就可以了,但使用列表推导会略短。例如,而不是

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]

也可以使用切片分配就地修改列表(参见this question):

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

如果您根据与"模板的完全匹配过滤技能"技能,即匹配skill_to_remove的所有属性,那么为你的技能类实现一个相等的方法可能会更好(见this question)。然后,您可以在remove上使用self.skills方法。但是,这只会删除第一个匹配的实例。