在两个不同列表中查找同一索引号以比较值的最有效方法

2024-04-27 11:08:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下代码,这是我需要帮助的登录功能。我有两个列表-用户名和密码。登录功能要求用户输入用户名和密码。如果输入的用户名在“用户名”列表中,并且与“密码”列表中的相同索引号相对应,则返回“已授予访问权限”,否则返回“拒绝”。在

出于教学目的,我对两件事感兴趣: a) 使用指定的两个列表对问题进行简单的修复。 b) 关于解决这个问题的最佳方法的建议。(例如字典、2darrays或其他任何东西)。在

问题是需要同时迭代两个列表并查找相同的对应索引号。在

示例:

username1 and pass1=已授予访问权限但是username1 and pass2=拒绝访问

代码:

usernames=["user1","user2","user3"]
passwords=["pass1","pass2","pass3"]

def main():
   mainmenu()


def mainmenu():
   print("****MAIN MENU****")
   print("=======Press L to login :")
   print("=======Press R to register :")
   choice1=input()
   if choice1=="L" or choice1=="l":
      login()
   elif choice1=="R" or choice1=="r":
      register()
   else:
      print("please make a valid selection")

def login():
   print("*****LOGIN SCREEN******")
   username=input("Username: ")
   password=input("Password: ")
   if username in usernames and password in passwords:
      print("yes")
   else:
      print("denied")


def register():
   print("*****REGISTRATION****")
   username=input("Enter a username:")
   password=input("Enter a password:")
   usernames.append(username)
   passwords.append(password)
   answer=input("Do you want to make another registration?")
   if answer=="y":
      register()
   else:
      registration_details()

def registration_details():
   print(usernames)
   print(passwords)

main()

注意:我知道将列表存储在2d数组中是一个明显的解决方案/建议,但出于教学原因,此修复是必要的-即学生根本没有覆盖数组。首先考虑简单的解决方案,但是stackoverflow用户也会从其他/更有效的方法来解决这个问题的建议中受益。在

更新:

正如有人在下面评论的那样……我想我应该澄清一下。我知道所需要的是得到列表中所述值的索引号。我的问题是-什么是最好的解决方案,或者一些解决方案。枚举。拉链。只使用for循环?很难知道如何用python开始,因为python不仅仅有一种方法……任何关于哪一种最惯用(pythonic)的注释也会很有用。在

最佳答案:

这可能是最好的答案,下面由Damian Lattenero提出 下面的缩进,一个常见的错误,是关闭的。有没有可能也只是快速的评论一下为什么?如何修复?在

^{pr2}$

输出

*****LOGIN SCREEN******
Username: user3
Password: pass3
invalid username or password
invalid username or password
correct login
>>> 

Tags: orregister密码列表inputdefusernamelogin
3条回答

如果你想教python基础。。。在

zip(usernames, passwords)

导致

^{pr2}$

但你也可以。。。在

for (idx, username) in enumerate(usernames):
   valid_password = passwords[idx]

我建议在这种情况下使用字典,我将告诉你如何:

users_pass = {"user1" : "pass1", "user2":"pass2", "user3":"pass3"}

def login():
   print("*****LOGIN SCREEN******")
   username=input("Username: ")
   password=input("Password: ")
   if username not in users_pass:
      print("The user doesnt exist")
   elif users_pass[username] == password:
      print("password ok")


def register():
   print("*****REGISTRATION****")
   username=input("Enter a username:")
   password=input("Enter a password:")
   users_pass[username] = password
   answer=input("Do you want to make another registration?")
   if answer=="y":
      register()
   else:
      registration_details()

如果只想使用列表:

^{pr2}$

对代码的一个简单的修复方法是使用zip()。在

您需要替换此if语句:

if username in usernames and password in passwords:
    print("yes")
else:
    print("denied")

签署人:

^{pr2}$

但是,您可以使用dict来存储您的唯一用户名和密码,然后检查用户名是否在当前dict中,然后检查密码是否正确。在

相关问题 更多 >