繁体   English   中英

从多个列表中创建唯一的对象列表

[英]Creating unique list of objects from multiple lists

我已经定义了一个具有多个字段的自定义 object。

例如,假设我有一个学生 object,它由姓名、ID 和年龄组成。 为了比较两个学生并确定他们是否是同一个学生,我实现了一个__ eq__方法,该方法将返回两个学生的年龄、姓名和 ID 是否匹配。

def __eq__(self, other):
   return self.name == other.name and self.ID == other.ID and self.age == other.age

请记住,学生只是一个示例,因此不考虑学生 ID 往往是唯一的这一事实。

假设我有以下注册列表,其中包含任意数量的学生对象

[S1, S2, S3]
[S2, S3]
[S3, S5, S4]
[S1, S4, S2, S1]

我想创建一些包含以下元素的数据结构

S1, S2, S3, S4, S5

最简单的方法是初始化一些可以容纳很多东西的数据结构,抓取一个项目,检查它是否存在于结构中,如果不存在则添加它。

new_list = some_new_list 
for each list of students:
  for each student in the list:
     check if the student is in new_list
     #decide what to do 

如果我决定将它作为一个简单的列表来实现,随着我的列表继续增长,我可能会进行很多比较,特别是如果我有大量的学生和注册列表。

什么是实现这一点的有效方法? 两者都用于比较两个对象,然后使用该比较方法生成一组唯一的对象。

编辑:所以我尝试了一个简单的集合实现。

>>>a = Student("sample", 1234, 18)
>>>b = Student("sample", 1234, 18)
>>>students = set()
>>>students.add(a)
>>>b in students
False
>>>b == a
True

难道我做错了什么?

from itertools import chain
myset = set(chain(iterable1, iterable2, iterable3, iterable4))

您会获得独特的项目,并且您只对每个可迭代对象进行一次迭代。 chain从一系列可迭代对象中生成一个长可迭代对象。 如果您需要对其进行排序, sorted(myset)将为您提供一个排序列表。

您的Student class 需要实现与其__eq__兼容的__hash__

def __hash__(self):
    return (self.name, self.ID, self.age).__hash__()

我对你只有一句话。

这是集合的文档

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM