【发布时间】:2011-10-25 07:04:21
【问题描述】:
我已经定义了一个包含多个字段的自定义对象。
例如,假设我有一个 Student 对象,它由姓名、ID 和年龄组成。为了比较两个学生并确定他们是否是同一个学生,我实现了一个 __ eq__ 方法,该方法将返回两个学生的年龄、姓名和 ID 是否匹配。
请记住,学生只是一个示例,因此不考虑学生 ID 往往是唯一的这一事实。
假设我有以下注册列表,其中包含任意数量的学生对象
[S1、S2、S3] [S2、S3] [S3、S5、S4] [S1、S4、S2、S1]我想创建一些包含以下元素的数据结构
S1、S2、S3、S4、S5最简单的方法是初始化一些可以容纳很多东西的数据结构,抓取一个项目,检查它是否存在于结构中,如果不存在则添加它。
new_list = some_new_list 对于每个学生列表: 对于列表中的每个学生: 检查学生是否在 new_list #决定做什么如果我决定将它作为一个简单的列表来实现,随着我的列表继续增长,我可能会进行大量比较,尤其是当我有大量的学生和注册列表时。
什么是实现这一点的有效方法?两者都用于比较两个对象,然后使用该比较方法生成一组唯一的对象。
编辑:所以我尝试了一个简单的集合实现。
>>>a = Student("样本", 1234, 18) >>>b = Student("样本", 1234, 18) >>>学生=设置() >>>students.add(a) >>>b 在学生 错误的 >>>b == a 真的我做错了吗?
【问题讨论】:
-
为什么不用内置的set类型呢?成员资格测试可能比您在纯 Python 中所希望的更有效。
-
@omrib,所以遍历每个学生列表,然后调用 newSet.add(student) 是否尽可能好?
-
@agf,哦,我以为只检查一个项目是否存在于集合中就足够了。即:“成员资格测试”
-
你没有有来检查他们是否在集合中。只需将它们全部添加,该集合最终将包含唯一条目。这比单独检查一个是否唯一要快。查看我对
__hash__的编辑 -
@agf,大概就是这样。但是,当我实现哈希方法并尝试使用相同名称 ID 和年龄(即:同一个学生)的两个不同学生对象时,它们都被添加到集合中。
标签: python performance