从文件中创建Class对象列表,在对象的属性中没有重复

时间:2017-10-08 19:50:37

标签: python-3.x

我目前正在学校学习一些计算机科学课程并走到了尽头,需要一些帮助。就像标题所说,我需要从文件中创建一个Class对象列表,其中包含没有添加到列表中的副本的对象,我能够使用python set()成功完成此操作,但显然不是&#39 ; t允许这个特定的任务,我已经尝试过各种其他方式,但似乎无法在不使用集合的情况下使其工作。我相信这个任务的重点是比较python中的数据结构并使用最慢的方法,因为它也必须定时。我将提供使用set()的代码。

import time

class Students:
    def __init__(self, LName, FName, ssn, email, age):
        self.LName = LName
        self.FName = FName
        self.ssn = ssn
        self.email = email
        self.age = age

    def getssn(self):
        return self.ssn

def main():
    t1 = time.time()
    f = open('InsertNames.txt', 'r')
    studentlist = []
    seen = set()
    for line in f:
        parsed = line.split(' ')
        parsed = [i.strip() for i in parsed]
        if parsed[2] not in seen:
            studentlist.append(Students(parsed[0], parsed[1], parsed[2], parsed[3], parsed[4]))
            seen.add(parsed[2])
        else:
            print(parsed[2], 'already in list, not added')
    f.close()
    print('final list length: ', len(studentlist))
    t2 = time.time()
    print('time = ', t2-t1)
main()

注意,要检查的唯一重复项是.ssn属性的副本,并且副本不应添加到列表中。有没有办法在添加之前检查该特定属性列表中已有的内容?

编辑:忘记仅提及内存中允许的1个列表。

2 个答案:

答案 0 :(得分:0)

你可以写

if not any(s.ssn==parsed[2] for s in studentlist):

没有将此比较视为==的含义。在这个工作级别,你可能需要写出循环并自己设置一个标志,而不是使用生成器表达式。

答案 1 :(得分:0)

由于您已花时间编写代表学生的类,并且ssn是实例的唯一标识符,因此请考虑为该类编写__eq__方法。

def __eq__(self, other):
    return self.ssn == other.ssn

当您想要比较两名学生时,这会让您的生活更轻松,在您的情况下,您可以成为list(特别是set)学生。

然后你的代码看起来像:

with open('InsertNames.txt') as f:
    for line in f:
        student = Student(*line.strip().split())
        if student not in student_list:
            student_list.append(student)

<强>解释

  1. 使用with语句打开文件可使您的代码更加干净 使其能够处理错误并正确清理。和 由于'r'open的默认值,因此不需要在那里。
  2. 在分割之前你应该strip这条线只是为了处理一些 边缘情况,但这不是强制性的。
  3. split的默认参数是' '所以再次没有必要。 只是为了澄清这个项目的含义是缺少参数使split使用空格。这并不意味着单个空格字符是默认字符。
  4. 在将学生添加到列表之前创建学生听起来也是如此 这个简单使用的开销很大,但因为只有一个 称为__init__的方法并不坏。这方面的好处 是因为它使not in语句使代码更具可读性。
  5. in语句(当然还有not in)检查是否 对象在该列表中,具有该对象的__eq__方法。 由于您实现了该方法,因此可以检查in语句 适用于Student类实例。
  6. 只有学生不在列表中,才会添加。

    最后,除了您创建的splitstudent_list的返回值之外,此处不会创建列表。