当前位置: 首页 > 面试题库 >

使用Python删除对象列表中的重复项

平和雅
2023-03-14
问题内容

我有一个对象列表,并且有一个充满记录的数据库表。我的对象列表具有标题属性,我想从列表中删除所有具有重复标题的对象(保留原始对象)。

然后,我要检查我的对象列表是否在数据库中有任何记录的重复项,如果是,请在将它们添加到数据库之前从列表中删除这些项目。

我已经看到了从这样的列表中删除重复项的解决方案:myList = list(set(myList)),但是我不确定如何使用对象列表来做到这一点?

我也需要维护对象列表的顺序。我也在想,也许我可以difflib用来检查标题之间的差异。


问题答案:

set(list_of_objects),如果你知道一个重复的是什么,只会删除重复的,也就是说,你需要定义一个对象的唯一性。

为此,您需要使对象可哈希化。您需要同时定义__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()使用时,它将删除一本书。

编辑
:这是我的一个老anwser,但我现在才注意到它有它在最后一段删除线更正错误:与相同的对象hash()不会放弃True的时候相比is。但是,如果打算将对象用作集合的元素或用作字典中的键,则使用对象的哈希性。



 类似资料:
  • 问题内容: 我有一个字典列表,其中特定值重复多次,我想删除重复的值。 我的清单: 删除重复值的功能: 当我调用此函数时,我得到了。 当我尝试遍历生成器时,我得到 有没有办法删除重复的值或遍历生成器 问题答案: 您可以通过字典理解轻松地删除重复键,因为字典不允许重复键,如下所示- 输出-

  • 问题内容: 我在Python中有一个列表列表: 我想从中删除重复的元素。如果这是正常列表,而不是我可以使用的列表set。但不幸的是,该列表不可散列,因此无法建立一组列表。只有元组。因此,我可以将所有列表转换为元组,然后使用set并返回列表。但这不是很快。 如何以最有效的方式做到这一点? 上面的结果应为: 我不在乎保留订单。 注意:这个问题很相似,但不是我所需要的。搜索了SO,但没有找到确切的重复项

  • 我有两个对象列表,它们在两个列表中都有重复名称。我需要从清单2中删除清单1中的所有重复值。 下面是一个场景,类有名称变量,用这个变量需要检查清单1中的重复值并需要删除。 //这是具有3个对象的第一个列表 清单1大小为1 请建议我在Java8与流。

  • 我想删除这个列表中的无值 并得到如下输出

  • 问题内容: 我想从列表列表中删除所有重复列表。 所以我有一个这样的清单清单。 我希望有: 我不知道该怎么办。 谢谢 问题答案: 您可以使用一组: 或者,如果您更喜欢列表推导/生成器: 最后,如果顺序很重要,则可以始终对b进行排序:

  • 问题内容: 如果想基于每个嵌套列表的第一个元素评估重复项,谁能提出一个好的解决方案从嵌套列表中删除重复项? 主列表如下所示: 如果已经在第一位置出现了另一个具有相同元素的列表,那么我想删除该列表并得到以下结果: 您可以建议一种算法来实现此目标吗? 问题答案: 您是否关心保留订单/删除了哪些重复项?如果不是,则: 会做的。如果您想保留订单并想保留第一个订单,则: