我有一个对象列表,并且有一个充满记录的数据库表。我的对象列表具有标题属性,我想从列表中删除所有具有重复标题的对象(保留原始对象)。
然后,我要检查我的对象列表是否在数据库中有任何记录的重复项,如果是,请在将它们添加到数据库之前从列表中删除这些项目。
我已经看到了从这样的列表中删除重复项的解决方案:myList = list(set(myList)),但是我不确定如何使用对象列表来做到这一点?
myList = list(set(myList))
我也需要维护对象列表的顺序。我也在想,也许我可以difflib用来检查标题之间的差异。
difflib
的set(list_of_objects),如果你知道一个重复的是什么,只会删除重复的,也就是说,你需要定义一个对象的唯一性。
set(list_of_objects)
为此,您需要使对象可哈希化。您需要同时定义__hash__和__eq__方法,方法如下:
__hash__
__eq__
http://docs.python.org/glossary.html#term- hashable
不过,您可能只需要定义__eq__方法。
编辑 :如何实现该__eq__方法:
正如我所提到的,您需要知道对象的唯一性定义。假设我们有一本书,其属性author_name和title组合在一起是唯一的(因此,我们可以有很多书由Stephen King撰写,许多书名为The Shining,但只有一本书由Stephen King命名为The Shining),然后实现如下:
def __eq__(self, other): return self.author_name==other.author_name\ and self.title==other.title
同样,这就是我有时实现__hash__方法的方式:
def __hash__(self): return hash(('title', self.title, 'author_name', self.author_name))
您可以检查是否创建了两本具有相同作者和标题的书籍的列表,这些书籍对象将 是相同的(带is操作符)和相等的(带==操作符)。同样,set()使用时,它将删除一本书。
is
==
set()
编辑 :这是我的一个老anwser,但我现在才注意到它有它在最后一段删除线更正错误:与相同的对象hash()不会放弃True的时候相比is。但是,如果打算将对象用作集合的元素或用作字典中的键,则使用对象的哈希性。
hash()
True