2015-03-31 29 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