2016-01-14 29 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如果這樣做找不到這個人。如果不使用默認返回,則必須使用生成器表達式。所以這告訴你一個人的存在,並給你他們的記錄。