我目前正在学校学习一些计算机科学课程并走到了尽头,需要一些帮助。就像标题所说,我需要从文件中创建一个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个列表。
答案 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)
<强>解释强>
with
语句打开文件可使您的代码更加干净
使其能够处理错误并正确清理。和
由于'r'
是open
的默认值,因此不需要在那里。strip
这条线只是为了处理一些
边缘情况,但这不是强制性的。split
的默认参数是' '
所以再次没有必要。
只是为了澄清这个项目的含义是缺少参数使split
使用空格。这并不意味着单个空格字符是默认字符。__init__
的方法并不坏。这方面的好处
是因为它使not in
语句使代码更具可读性。in
语句(当然还有not in
)检查是否
对象在该列表中,具有该对象的__eq__
方法。
由于您实现了该方法,因此可以检查in
语句
适用于Student
类实例。只有学生不在列表中,才会添加。
最后,除了您创建的split
和student_list
的返回值之外,此处不会创建列表。