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的[ 「決策點」],[ 「我的生活」],[ 「馬特」]]
字典密鑰必須是可散列的且不要求的。名單?使用'set([....])'擺脫重複。你的數據大小有多大?如果它很小,一次刪除重複是很好的,但是當它較大時(當時你想用「yield」來反饋大塊數據)很好, – User007
你是否忽略了你的__init__方法當你發佈類時,或者是缺少'__init__'方法的類? – SethMMorton
是的,我忘記了__init__方法,代碼非常長。 –