2015-05-22 60 views
0

我驗證用戶名或密碼字段是否爲空。檢查用戶名是否存在於列表中,並且只在不存在時創建用戶

但我也想驗證用戶名是否已經存在。

我有這個變量userList,其中包含所有用戶的列表。

我想顯示一條消息「用戶名已存在」,並且如果用戶輸入的用戶名已存在於此列表中,則再次詢問用戶名和密碼。

我試圖用下面的代碼做到這一點,但它不工作。

您是否看到問題所在?

usersList有這樣的內容:

[{u'path': u'/', u'create_date': u'2015-05-12T11:32:04', u'user_name': u'UserTest', u'user_id': u'IBM4'}, {u'path': u'/', u'create_date': u'2015-05-22T17:11:02Z', u'user_name': u'User2'}] 

代碼:

def createUser(): 
    while True: 
     username = raw_input("Username:") 
     password = raw_input("Password:") 
     if not username or not password: 
      print "Enter a valid username and password..." 
     users = c.get_all_users() 
     userList = users['list_users_response']['list_users_result']['users'] 
     if username in userList: 
      print "username already exist" 
     else: 
      # I just want to create if fields are not empty and if username dont exist 
      c.create_user(username) 
createUser() 
+0

什麼是「不工作「 意思?如果它引發異常,請編輯您的問題並粘貼異常和回溯。如果它做錯了什麼,[編輯]準確地解釋它在什麼樣的測試用例以及它應該做什麼。此外,如果您可以將您的代碼縮減爲[最小,完整,可驗證的示例](http://stackoverflow.com/help/mcve),而不是給我們提供一個不完整且部分不相關的片段,這將使它更容易回答。 – abarnert

+0

'c'應該是什麼? –

回答

1

這將是更簡單,如果你使用正確的數據結構的工作更有效率。如果您需要通過用戶名查找用戶,請將其存儲在字典中,並將用戶名作爲鍵,而不是列表中。

舉例來說,如果不是這樣的:

userList = [{u'path': u'/', u'create_date': u'2015-05-12T11:32:04', u'user_name': u'UserTest', u'user_id': u'IBM4'}, 
      {u'path': u'/', u'create_date': u'2015-05-22T17:11:02Z', u'user_name': u'User2'}] 

...你有這樣的:

userList = {u'IBM4': {u'path': u'/', u'create_date': u'2015-05-12T11:32:04', u'user_name': u'UserTest', u'user_id': u'IBM4'}, 
      u'User2': {u'path': u'/', u'create_date': u'2015-05-22T17:11:02Z', u'user_name': u'User2'}} 

...那麼你現有的代碼將工作:

if username in userList: 

但是,如果你真的想使用你現有的數據聖(這也是你不應該這樣做的),問題是username in userList正在詢問userList中的任何內容是否等於username。但userList中的內容不是用戶名,它們是字典,所以它們都不會相同。

你需要做的是:

if any(user['user_name'] == username for user in userList): 

注意,這是一個複雜得多。如果您的用戶數量較少,則速度也會慢很多,因爲它必須逐個檢查每個用戶,並檢查其user_nameusername之間的差異。這就是爲什麼你想使用字典而不是列表。

+0

感謝您的解答和解釋! – techman

1

你有列表的字典。你想比較字符串與dict

if username in userList: 

而且它沒有定義什麼get_all_users()確實

你的數據結構應該是用戶名映射爲attrs:

{ 
'user1': {'path': '/1', ....}, 
'user2': {'path': '/2', ....}, 
} 
相關問題