如何在对象列表中搜索属性?

时间:2016-01-14 14:07:18

标签: python

我正在python中创建一个电话注册表,用户可以选择将新人添加到注册表中。我需要获取代码来查找该用户是否已经在寄存器中。我的对象具有surnamefirstnamephonenumberaddress属性。

我的代码如下所示:

def personInRegister(surname, firstname, phonenumber, address):
    matchInRegister = False
    x = 0
    while x in range(len(people)):
        if (people[x].surname.lower == surname.lower and
            people[x].firstname.lower == firstname.lower and
            people[x].phonenumber == phonenumber and
            people[x].address.lower == address.lower):
             matchInRegister = True
             break
        else:
            x = x+1
    return matchInRegister

人们是我的人名单。

我和它没有工作,我不知道我做错了什么。请帮忙!

1 个答案:

答案 0 :(得分:5)

str.lower是一个功能。 str.lower()调用该函数并返回该字符串的小写版本。

Python有一个有用的功能,用于检查序列中的any值是否为True。所以我们可以像这样建立一个布尔值序列:

def personInRegister(surname, firstname, phonenumber, address):
    return any(person.surname.lower() == surname.lower() and
               person.firstname.lower() == firstname.lower() and
               person.phonenumber == phonenumber and
               person.address.lower() == address.lower()
               for person in people)

为避免每次通过循环调用lower()查询,您可以将查询创建为元组并进行比较:

def personInRegister(surname, firstname, phonenumber, address):
    query = (surname.lower(),
             firstname.lower(),
             phonenumber,
             address.lower())
    return any((person.surname.lower(),
                person.firstname.lower(),
                person.phonenumber,
                person.address.lower()) == query
               for person in people)

如果您想返回person,可以使用next

def personInRegister(surname, firstname, phonenumber, address):
    query = (surname.lower(),
             firstname.lower(),
             phonenumber,
             address.lower())
    return next((person for person in people
                 if query == (person.surname.lower(),
                              person.firstname.lower(),
                              person.phonenumber,
                              person.address.lower())),
                None)

如果找不到此人,将返回None。如果不使用默认返回,则必须使用生成器表达式。所以这告诉你一个人的存在,并给你他们的记录。