请帮我看看下面我遗漏了什么。我首先创建了类的三个对象并将它们添加到集合列表中。在创建任何其他对象之前,我要检查以确保列表中不存在该人。如果该人已经存在,则不应再创建该人。我希望通过做if prompt_fname == person.fname and prompt_lname == person.lname:
来实现这个检查。显然,我做得不对,因为程序仍然运行并创建了列表中已经存在的同一个人。它创造了这个人两次。如何修改以捕获此项,以便不再创建已存在于列表中的人员。同样,在循环的每次迭代中都不应该一次又一次地创建任何新人。我不熟悉编程,所以请不要在回答中遗漏太多细节。谢谢。在
class Person(object):
personslist = []
'''Creates a person object'''
def __init__(self, firstname, lastname):
self.lname = lastname.title()
self.fname = firstname.title()
Person.personslist.append(self)
def __str__(self):
return "{0} {1}".format(self.fname, self.lname)
def __repr__(self):
return "{0} {1}".format(self.fname, self.lname)
Person("Adamu", "Emeka")
Person("Femi", "Ojukwu")
Person("Wole", "Jonathan")
prompt_fname = "Adamu"
prompt_lname = "Emeka"
print(Person.personslist)
for person in Person.personslist:
if prompt_fname == person.fname and prompt_lname == person.lname:
pass
else:
Person(prompt_fname, prompt_lname)
print(Person.personslist)
收益率
^{pr2}$使用Python 3.4.1
循环正在检查每个条目,如果该条目不相等,它将创建另一个实例。但是如果这个特定的条目是相等的,它不会停止,它只会继续到下一个条目,而下一个条目将不相等。这就是为什么在结尾处有两个额外的条目。在
您可以通过保留一个标志来解决此问题:
然而,有一个更好的方法来做到这一点:你的方法效率非常低,因为它每次都需要进行线性扫描。相反,保留一个按全名键入对象的字典:
^{pr2}$现在您只需一次入住即可:
此代码没有执行它应该执行的操作:
使用
for person in Person.personslist:
它将检查您已经创建的三个Person()对象。第一个是'Adamu Emeka',因此名称相等,'if'语句达到'pass'。但是,personslist中的下一个项的名称是“Femi Ojukwu”,并且if
中的名称不相等,因此它到达else
子句并创建一个新对象。第三个名字也是如此。这就是为什么你有两个额外的副本阿达木峨眉。在另一种解决方案请参见丹尼尔·罗斯曼的答案
每次添加名称前,请检查完整列表:
相关问题 更多 >
编程相关推荐