2014-04-20 12 views
0

因此,我做了下面的類,並將它的實例存儲在列表中。python-如何刪除基於其數據成員的列表中的對象

class Word: 
    def __init__(self,word,definition,synonyms): 
     self.w=word 
     self.defi=definition 
     self.synonyms=synonyms 

我敢肯定,我可以通過列表循環和檢查每個實例,但我試圖這樣做,用列表的remove方法。 x是Word的一個對象列表

word="hi" 
x.remove(Word if Word.w==word) 

這給了我一個錯誤。那麼有沒有類似的方式來做到這一點?

編輯 我試圖簡化我的問題,但顯然我的意圖不明確。 我有一個字典,其中的鍵是最後2個字母(用戶添加),其值是與這兩個最後字符的單詞列表。例如:

w1=Word("lengthen","make something taller","some synonym") 
w2=Word("woken","let someone wake up","some synonym") 
w3=Word("fax","machine used for communication","some synonym") 
w4=Word("wax","chemical substance","some synonym") 
['en':(w1,w2),'ax':(w3,w4)] 

我試圖定義一個方法刪除內搭字典和一個字(字符串),那麼它會刪除含有下列字的對象的字。

def delete(dictionary,word): 
    if word[-2:] in dictionary: 
     x=dictionary[word[-2:]] 
     if(x.count(word)!=0): 
      x.remove(Word if Word.w==word) 
+0

原因之一'刪除()'ISN」對於你所要做的工作是因爲你的字典中的值是'tuple's,而不是'list',並且元組沒有'remove()'方法,因爲它們是不可變的。您需要更改值的類型或用新的元組對象替換現有的值。 – martineau

回答

1

我認爲這會做你想要什麼:

class Word: 
    def __init__(self,word,definition,synonyms): 
     self.w=word 
     self.defi=definition 
     self.synonyms=synonyms 
    def __repr__(self): # added to facilitate printing of tuples of Word objects 
     return 'Word({}, {}, {})'.format(self.w, self.defi, self.synonyms) 

w1=Word("lengthen", "make something taller", "some synonym") 
w2=Word("woken", "let someone wake up", "some synonym") 
w3=Word("fax", "machine used for communication", "some synonym") 
w4=Word("wax", "chemical substance", "some synonym") 

dictionary = {'en': (w1, w2), 'ax': (w3, w4)} 

def delete(dictionary, word): 
    suffix = word[-2:] 
    if suffix in dictionary: 
     dictionary[suffix] = tuple(word_obj for word_obj in dictionary[suffix] 
            if word_obj.w != word) 

delete(dictionary, 'woken') 
print(dictionary) 
+0

謝謝,我認爲這將工作。 –

3

您一般會使用列表理解來建立一個沒有相匹配的新的列表,否則你最終想要在遍歷它來修改列表:

x = [word for word in x if word.w != "hi"] 

注意小寫word;使用Word會影響課程本身。

如果就地改變列表中是至關重要的,你可以用切片:

x[:] = [word for word in x if word.w != "hi"] 
+0

因爲'list.remove'就地工作,所以你可能想要做'x [:] = [如果word.w!=「hi」],那麼在x中單詞。這將保持列表對象相同。 – iCodez

+0

@iCodez好建議,謝謝 – jonrsharpe

+0

嗨,我想你誤會了我,請檢查我的編輯,謝謝:) –

相關問題