2012-04-25 21 views
0

刪除從列表中選擇多個「類」在python

class rel: 
    child='' 
    parent='' 
listPar=[] 

和listPar我有這些類(抱歉術語列表,我不知道,如果它被稱爲類,它是?)在listPar中,我有例如:房間的書;書名 ;房間的書,書名

現在我嘗試刪除所有非唯一出現次數,所以我想有隻

房間的書;在listPar

書名假設,那我還有下面的代碼:

variable="Book" 
variable2="Author" 
toIns=rel() 
toIns.parent=variable 
toIns.child=variable2 
listPar.append(toIns) 

toIns2=rel() 
toIns2.parent=variable 
toIns2.child=variable2 
listPar.append(toIns2) 

現在如何刪除所有重複? (結果 - >

for elem in listPar: 
    print "child:",elem.child,"parent:",elem.parent 

#child:author, parent:book 

我已經試過幾件事,但沒有人似乎完全work..could請你幫我

+1

該術語將是該課程的對象。 – phg 2012-04-25 09:46:36

+2

或者* instances *也用了很多。 – 2012-04-25 09:56:18

回答

5

我假定類,你給有ISN」? (因爲它毫無價值),但最簡單的事情就是在這裏做 - 假設你的元素的順序對你無關緊要,就是把你的列表變成一個集合,它將刪除所有重複的元素。

>>> a = ["test", "test", "something", "else"] 
>>> a 
['test', 'test', 'something', 'else'] 
>>> set(a) 
{'test', 'something', 'else'} 

這裏我使用了字符串,但是您可以使用任何提供e高質量的算子和散列函數。相等函數用於檢查兩個類是否相同(對於自定義類,您需要定義該類),並使用散列來使集合非常有效。兩個類別給予相同的散列必須是相同的。你可以有兩個相同散列的類不相同(它會回落到相等運算符),但發生的越多,它越慢。通常,使用用於檢查相等性的類組件的哈希總和是生成可靠哈希的好方法。

因此,舉例來說:

class Book: 
    def __init__(self, title, author): 
     self.title = title 
     self.author = author 

    def __eq__(self, other): 
     return self.title == other.title and self.author == other.author 

    def __hash__(self): 
     return hash(self.title)+hash(self.author) 

    def __repr__(self): 
     return "Book("+repr(self.title)+", "+repr(self.author)+")" 

我們可以使用這個類像以前一樣。

>>> a = [Book("Some Book", "Some Guy"), Book("Some Book", "Some Guy"), Book("Some Other Book", "Some Other Guy")] 
>>> a 
[Book('Some Book', 'Some Guy'), Book('Some Book', 'Some Guy'), Book('Some Other Book', 'Some Other Guy')] 
>>> set(a) 
{Book('Some Other Book', 'Some Other Guy'), Book('Some Book', 'Some Guy')} 

如果你關心元素的順序,甚至去除重複之後,那麼你可以這樣做:

def remove_duplicates_preserving_order(seq): 
    seen = set() 
    return [ x for x in seq if x not in seen and not seen.add(x)] 

這是通過黑客詞典理解一點 - set.add()總是返回0 ,所以你可以檢查它是否爲假(它總是)將元素添加到集合中。

編輯進行更新:

請注意:PEP-8使用CapWords上課,並lowercase_with_underscores當地 變量reccomends 。

您似乎對Python類的工作方式存在誤解。這個類 並沒有多大意義,因爲這些屬性都屬於類屬性,而不是實例 屬性。這意味着它們對於 類的所有實例都是相同的,這不是你想要的。這意味着當你第二次改變它們時,你將會改變它的所有實例,使得它們全都是 。

要創建實例變量(你想要的類型) 構造函數(__init__()) - 檢查我的示例類,看看它是如何工作的。 完成此操作後,您需要執行__eq__()__hash__() 函數,以便Python知道您的類的兩個項目 的含義是否相等。然後你可以使用上面描述的方法(一套或我給的功能 )刪除重複項。

請注意,如果您希望使用這些數據來處理這些問題,那麼可能會導致一個類別過大。 如果你總是將有兩個項目,則可以只使用一個元組:

>>> a = [("Book", "Author"), ("Book", "Author"), ("OtherBook", "OtherAuthor")] 
>>> set(a) 
{('Book', 'Author'), ('OtherBook', 'OtherAuthor')} 

元組已經爲您定義平等作爲其部分的總和。總的來說,你似乎對Python中如何構造和使用類缺乏理解 - 我建議你閱讀並學習如何在其他任何東西之前使用它們,因爲不這樣做會導致很多問題。

+0

我想說他正在試圖描述關係,比如'Rel('Room','Book')'意思是一個房間可以包含一本書,然後存儲這些值。但是你完全正確,我會建議在'Rel'中加入'__eq__'。 – phg 2012-04-25 09:54:49

+0

@phg我真的只是舉一個通用的例子,這個想法可以應用到任何地方。 – 2012-04-25 09:56:40

+0

對不起,我不知道現在該做什麼。 假設,即我已經以下代碼: 類的rel: 孩子= '' 父= '' listPar = [] 聚乙內酰脲= REL() toIns.parent =可變 toIns.child =變量2 listPar.append(toIns) 現在如何刪除所有重複? – Johnzzz 2012-04-25 10:10:43