python 如何查看一个列表是否在另一个列表中

fhity93d  于 2023-02-28  发布在  Python
关注(0)|答案(1)|浏览(200)

我正在编写一个简单的程序,如果用户提供的登录详细信息与列表中的详细信息匹配,则返回True/False。

...
details = [['Charlie', 'Password'],
           ['Turnbull', 'Password']]

def authenticate():
    login_details = get_entry_values()  # list of user input [username, password]
    for username, password in details:
        if login_details[0] == username and login_details[1] == password:
            print("Authenticated")
            return True
        else:
            print("Incorrect")
            return False

但是,当我输入第一个登录详细信息(“Charlie”后接“Password”)时,它返回True,但当我输入第二个时,它返回False

jutyujz0

jutyujz01#

因为你有一个列表的列表,你想看看一个给定的列表是否在列表的列表中,你不需要循环遍历这个列表,你只需要做:

def authenticate():
    login_details = get_entry_values()
    if login_details in details:
        print("Authenticated")
        return True
    else:
        print("Incorrect")
        return False

如果你不想打印任何东西(你可能不应该打印,因为这会增加代码重用的难度),那么函数可以简化为:

def authenticate():
        return get_entry_values() in details

不过,让我们回到你的原始代码,看看问题出在哪里,很简单:你只检查列表中的第一个密码。你的if语句总是返回,无论是否匹配,所以代码从不考虑details中的第二个或后续项。你需要做的是 * 保持检查 * 如果你没有得到匹配。换句话说,直到你完成循环,密码才能被声明为不正确。所以:

def authenticate():
    login_details = get_entry_values()  # list of user input [username, password]
    for username, password in details:
        if login_details[0] == username and login_details[1] == password:
            print("Authenticated")
            return True
    print("Incorrect")
    return False

正如其他人在评论中提到的,字典是存储用户名和密码的更好的数据结构,如果使用字典,就根本不需要循环了:

details = {'Charlie': 'Password',
           'Turnbull': 'Password'}

def authenticate():
    username, password = get_entry_values()
    authenticated = details.get(username) == password
    print("Authenticated" if authenticated else "Incorrect")
    return authenticated

如果用户名不在字典中,这里使用dict.get()返回None,并且None不等于任何字符串,因此这有效地同时检查了用户名存在和密码正确。

相关问题