2016-04-15 59 views
-1

我很難弄清楚我應該如何初始化我的類。所以,當我這樣做時,我得到了一個結果,但它也返回布爾類型。我只想讓它返回正常數字的任何想法?恩。賠率Python Dict Set類初始化程序

class DictSet: 

    def __init__(self, elements): 
     self.elements = {} 
     for i in elements: 
      self.elements[i] = True 

    def addElement(self, x): 
     self.elements.update(x) 

    def deleteElement(self, x): 
     for i in (self.elements): 
      if i == x: 
       del self.elements[x] 

    def member(self, x): 
     for i in (self.elements): 
      if i == x: 
       return True 
      return False     #Checks if its an item 

    def intersection(self, set2): 
     add = [] 
     for i in self.elements: 
      if i in set2.elements: 
       add.append(i) 
     return DictSet(add) # Returns Intersected New List 

    def union(self, set2): 
     return DictSet(list(self.elements.keys()) + list(set2.elements.keys())) #Puts all the elements together 

    def subtract(self, set2): 
     sub = [] 
     for i in self.elements: 
      if i not in set2.elements: 
       sub.append(i) 
     return DictSet(sub)  # Only return ones set of elements 

    def __repr__(self): 
     return "<Set: " + str(self.elements) + ">" 


def main(): 
    all = DictSet([1,2,3,4,5,6,7,8,9,10]) 
    odds = DictSet([1,3,5,7,9]) 
    evens = DictSet([2,4,6,8,10]) 
    print("all", odds.union(evens)) 
    print("all", evens.union(odds)) 
    print("empty", odds.intersection(evens)) 
    print("odds", all.intersection(odds)) 
    print("odds", all.subtract(evens)) 

if __name__ == '__main__': 
    main() 

想不出格式,這正常所以這會是一些格式化的問題

+3

「返回正常數字」是什麼意思?從什麼功能返回什麼數字?你沒有描述這個類的語義應該是什麼,所以我不知道我在代碼中看到的是錯誤的還是按照預期工作。 – Blckknght

+0

@Blckknght對不起,我的前。因此我的第一張照片應該全部是而不是Im得到 all 我更改爲「 「在最後幾分鐘內。 – WannaBeCoder

回答

0

這並不完全清楚你想要完成什麼,但我可以告訴你爲什麼你得到了你得到的輸出。

首先,我想說明的是,當您的對象調用print時,它是__repr__函數,用於確定對象的顯示方式。在你的__repr__方法中,你有聲明return "<Set: " + str(self.elements) + ">"。你的領域,self.elements。是一本字典。如果在字典上使用str()函數,它會將字典轉換爲以{開頭並以}結尾的字符串,以便列出每個鍵/值對。您的密鑰是整數1到10,並且您已將所有值設置爲True(根據您的__init__)。所以,你給我們的代碼,你會看到輸出:

('all', <Set: {1: True, 2: True, 3: True, 4: True, 5: True, 6: True, 7: True, 8: True, 9: True, 10: True}>)

因爲self.elements STR()方法產生輸出{1: True, 2: True, 3: True, 4: True, 5: True, 6: True, 7: True, 8: True, 9: True, 10: True}。如果你想只顯示('all', <Set: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]>),那麼你就需要改變你的__repr__只顯示self.elements(不是)。你可以做到這一點,像這樣:

__repr__(self): return "<Set: " + str([key for key in self.elements]) + ">"

[key for key in self.elements]self.elements字典場每list comprehension創建密鑰列表。

或者,因爲你已經有這樣的事情在你的其他代碼,你可以只是做:

__repr__(self): return "<Set: " + str(self.elements.keys()) + ">"

我想__repr__最後這個定義更清晰一點,第一個是剛纔什麼立即衝進我的腦海。

我還想指出,如果我描述的輸出是您的最終目標,那麼您不需要self.elements的字典類型。使用列表會更清楚/更好。

0

既然你不想用你的字典的值,但只有鍵,它更恰當使用set代替的一個dict

set對象是不同可哈希對象的無序集合。