Python:使用词典和列表时防止数据重复

时间:2013-07-24 22:45:04

标签: python

Hello Stack Overflow!

我正在一个程序中执行一个简单的命令,该程序编译库中包含的所有书籍的报告。该库包含一个架子列表,每个架子包含一本书籍字典。然而,尽管我付出了最大努力,但我总是将我的所有书籍都复制在每一个书架上,而不是放在书架上,而不是我指示程序将书放在书架上。

我希望我错过了一些关于对象创建和组织的基本规则。

我相信罪魁祸首是书类中的奴隶和非书架方法。

非常感谢你的时间, 杰克

以下代码:

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()

输出:

<[''决定点','我的生活','马特宏'',['决定点','我的生命','马特洪峰'],['决定点','我的生命','马特洪峰' ]] 没有 [以0.1秒完成]

..代替[[“决策点”],[“我的生活”],[“马特霍恩”]]

1 个答案:

答案 0 :(得分:2)

  1. 使用dict.pop()代替del
  2. self.books = {}添加到shelf的{​​{1}}。不要在__init__之外声明books,因为如果你这样做,那个类的所有实例都会引用相同的东西。相反,这会使每个实例都有自己的字典,这当然是你想要的,因为一本书不能同时放在两个书架上。
  3. __init__及其libraryshelves及其book执行相同操作。
  4. shelf_number个实例作为参数传递给libraryenshelf。当您从对象的方法中引用unshelf时,Python发现没有定义本地SPL,因此它搜索本地范围之外的一个;但如果您尝试将某些内容分配给SPL或进行其他类型的变更业务,则会获得SPL
  5. 奖励:
    • UnboundLocalErrorclass 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()。请注意,我不是迭代索引,而是遍历元素本身。如果您想亲眼看看,请在交互式shell中尝试return [shlf.get_books() for shlf in self.shelves]