Skip to main content
 首页 » 编程设计

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

2025年05月04日32开发

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

我的代码是这样的:

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 

people 是我的人员列表。

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

请您参考如下方法:

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

Python 有一个有用的函数来检查 any 是否存在。序列中的值为 True。所以我们可以像这样构建一个 bool 值序列:

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) 

如果你想返回人,你可以使用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。如果不使用默认返回,则必须使用生成器表达式。所以这告诉你一个人的存在,并给你他们的记录。