我定义了一个包含多个字段的自定义对象。
例如,我有一个学生对象,它由姓名、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 ```
我做错了什么吗?
例如,我有一个学生对象,它由姓名、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 ```
我做错了什么吗?
__hash__
编辑。 - agf