Python:在上创建新对象之前检查对象是否已经存在

2024-06-25 23:30:43 发布

您现在位置:Python中文网/ 问答频道 /正文

请帮我看看下面我遗漏了什么。我首先创建了类的三个对象并将它们添加到集合列表中。在创建任何其他对象之前,我要检查以确保列表中不存在该人。如果该人已经存在,则不应再创建该人。我希望通过做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


Tags: and对象self列表ifobjectdeffirstname
3条回答

循环正在检查每个条目,如果该条目不相等,它将创建另一个实例。但是如果这个特定的条目是相等的,它不会停止,它只会继续到下一个条目,而下一个条目将不相等。这就是为什么在结尾处有两个额外的条目。在

您可以通过保留一个标志来解决此问题:

found = False
for person in Person.personslist:
    if prompt_fname == person.fname and prompt_lname == person.lname:
        found = True
        break
if not found:
    Person(prompt_fname, prompt_lname)

然而,有一个更好的方法来做到这一点:你的方法效率非常低,因为它每次都需要进行线性扫描。相反,保留一个按全名键入对象的字典:

^{pr2}$

现在您只需一次入住即可:

if "%s %s" % (prompt_fname, prompt_lname) not in Person.persons_dict:

此代码没有执行它应该执行的操作:

for person in Person.personslist:
    if prompt_fname == person.fname and prompt_lname == person.lname:
        pass
    else:
        Person(prompt_fname, prompt_lname)

使用for person in Person.personslist:它将检查您已经创建的三个Person()对象。第一个是'Adamu Emeka',因此名称相等,'if'语句达到'pass'。但是,personslist中的下一个项的名称是“Femi Ojukwu”,并且if中的名称不相等,因此它到达else子句并创建一个新对象。第三个名字也是如此。这就是为什么你有两个额外的副本阿达木峨眉。在

另一种解决方案请参见丹尼尔·罗斯曼的答案

每次添加名称前,请检查完整列表:

name = prompt_fname + prompt_lname

if not any(person.fname + person.lname == name for person in Person.personslist):
    Person(prompt_fname, prompt_lname)

相关问题 更多 >