2013-07-24 33 views
0

Hello Stack Overflow!Python:使用字典和列表時防止重複數據

我在一個程序中執行一個簡單的命令,該程序編譯庫中包含的所有書籍的報告。圖書館包含書架清單,每個書架都包含書籍字典。然而,儘管我盡了最大的努力,但我總是複製我的所有書籍,並將它們放在每個書架上,而不是我指示程序放置本書的書架。

我希望我錯過了某種與對象創建和組織有關的基本規則。

我相信罪魁禍首是書類中的enshelf和unshelf方法。

謝謝你這麼多的時間, 傑克

代碼如下:

class book(): 

    shelf_number = None 

    def __init__(self, title, author): 
     super(book, self).__init__() 
     self.title = title 
     self.author = author 

    def enshelf(self, shelf_number): 
     self.shelf_number = shelf_number 
     SPL.shelves[self.shelf_number].books[hash(self)] = self 

    def unshelf(self): 
     del SPL.shelves[self.shelf_number].books[hash(self)] 
     return self 

    def get_title(self): 
     return self.title 

    def get_author(self): 
     return self.author 

class shelf(): 

    books = {} 

    def __init__(self): 
     super(shelf, self).__init__() 

    def get_books(self): 
     temp_list = [] 

     for k in self.books.keys(): 
      temp_list.append(self.books[k].get_title()) 
     return temp_list 

class library(): 

    shelves = [] 

    def __init__(self, name): 
     super(library, self).__init__() 
     self.name = name 

    def make_shelf(self): 
     temp = shelf() 
     self.shelves.append(temp) 

    def remove_shelf(shelf_number): 
     del shelves[shelf_number] 

    def report_all_books(self): 

     temp_list = [] 

     for x in range(0,len(self.shelves)): 
      temp_list.append(self.shelves[x].get_books()) 

     print(temp_list) 

#--------------------------------------------------------------------------------------- 
#----------------------SEATTLE PUBLIC LIBARARY ----------------------------------------- 
#--------------------------------------------------------------------------------------- 

SPL = library("Seattle Public Library")      

for x in range(0,3): 
    SPL.make_shelf() 

b1 = book("matterhorn","karl marlantes") 
b2 = book("my life","bill clinton") 
b3 = book("decision points","george bush") 

b1.enshelf(0) 
b2.enshelf(1) 
b3.enshelf(2) 

print(SPL.report_all_books()) 

b1.unshelf() 
b2.unshelf() 
b3.unshelf() 

OUTPUT:

[ '決策點', '我的生活', '馬特'] ,['決定點','我的生活','馬特霍恩'],['決定點','我的生活','馬特霍恩']] 無 [完成於0.1s]

..instead的[ 「決策點」],[ 「我的生活」],[ 「馬特」]]

+0

字典密鑰必須是可散列的且不要求的。名單?使用'set([....])'擺脫重複。你的數據大小有多大?如果它很小,一次刪除重複是很好的,但是當它較大時(當時你想用「yield」來反饋大塊數據)很好, – User007

+1

你是否忽略了你的__init__方法當你發佈類時,或者是缺少'__init__'方法的類? – SethMMorton

+0

是的,我忘記了__init__方法,代碼非常長。 –

回答

2
  1. 使用dict.pop(),而不是del
  2. self.books = {}加到shelf__init__。不要在__init__之外聲明books,因爲如果你這樣做,那個類的所有實例都會引用相同的東西。相反,這使得每個實例都有自己的字典,這當然是你想要的,因爲一本書不能同時在兩個架子上。
  3. library及其shelvesbook及其shelf_number做同樣的處理。
  4. library實例作爲參數傳遞給enshelfunshelf。當你在對象的方法中引用SPL時,Python發現沒有定義本地的SPL,所以它在本地作用域之外搜索一個;但如果你想嘗試給SPL分配一些東西,或者做一些其他類型的變化生意,你會得到一個UnboundLocalError
  5. 獎勵:
    • class book(object)class shelf(object)class library(object)。 (不會修復你的問題,但是你應該這樣做。)
    • 你不需要在使用它們之前對密鑰進行哈希處理,它們將被哈希(如果它們是可哈希的,但是如果你哈希它們,那麼他們)。
    • 除非您繼承某些東西,否則無需致電super(),在這種情況下,您可以使用它將方法調用委派給父代或兄弟姐妹 - 但您並未這麼做。
    • get_books()可以實現爲不外乎return [self.books[k].get_title() for k in self.books.iterkeys()]
    • 同樣爲report_all_books()return [shlf.get_books() for shlf in self.shelves]。請注意,我沒有迭代索引,而是遍歷元素本身。如果您想自己查看,請在交互式shell中嘗試for c in "foobar": print(c)
+0

嘿,我已經更新了代碼,它包含了所有的東西,我沒有告訴我已經有了__init__方法@ 2rs2ts,謝謝你的直接反應,我現在有了一些掘金,有了你的答案,我現在是一個波普爾人,而不是一個刪除者! –

+0

@JakeWay好吧,儘管我的語言將不得不改變,但你必須做的是相同的... – 2rs2ts

+0

感謝您幫我清理我的代碼!嘿,我檢查了你的個人資料和github。完成大學課程後,請務必使用數字接收器技術。 (思考的食物!)他們看起來在他們的網站上跛腳,但相信我,他們真的coooool狗屎。 ;) –