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

sed*_*deh 1 python for-loop python-3.x

请帮助我看看下面我缺少什么。我首先创建了班级的三个对象,并将它们添加到集合列表中。在创建任何其他对象之前,我要检查以确保该人在列表中不存在。如果此人已经存在,则不应再次创建该人。我希望通过执行此检查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)
Run Code Online (Sandbox Code Playgroud)

产量

[Adamu Emeka, Femi Ojukwu, Wole Jonathan]
[Adamu Emeka, Femi Ojukwu, Wole Jonathan, Adamu Emeka, Adamu Emeka]
Run Code Online (Sandbox Code Playgroud)

使用Python 3.4.1

Dan*_*man 5

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

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

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)
Run Code Online (Sandbox Code Playgroud)

但是,还有一种更好的方法:您的方法效率很低,因为每次都需要进行线性扫描。而是保留以全名作为关键字的对象的字典:

class Person(object):

    persons_dict = {}
    '''Creates a person object'''
    def __init__(self, firstname, lastname):
        self.lname = lastname.title()
        self.fname = firstname.title()
        fullname = "%s %s" % (self.fname, self.lname)
        Person.persons_dict[fullname] = self
Run Code Online (Sandbox Code Playgroud)

现在,您只需检查一下即可:

if "%s %s" % (prompt_fname, prompt_lname) not in Person.persons_dict:
Run Code Online (Sandbox Code Playgroud)