2016-01-14 30 views
1

我正在python中创建一个手机注册表,用户可以选择将新人添加到注册表中。我需要获取代码以查找该用户是否已经在注册中。我的对象具有surname,firstname,phonenumberaddress的属性。如何在对象列表中搜索属性?

我的代码如下所示:

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 

那里的人是我的人名单。

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

+5

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

回答

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