嵌套字典成员运算符使用问题:登录系统用户名校验报错
问题解决:嵌套字典中校验用户名的错误修复
错误原因
你遇到的AttributeError: 'dict_values' object has no attribute 'keys'是因为user.values()返回的是dict_values对象,它是外层字典所有内层字典的集合,不是单个字典,所以没有keys()方法,直接调用自然会报错。
修复方案
这里提供几种简单有效的方法来校验用户名是否存在于嵌套字典中:
方法1:用生成器表达式遍历所有用户名
写法简洁,无需额外创建列表:
user = { "admin" : {"alex" : "1234", "phil" : "3453", "peter" : "23423", "lucas" : "12133"}, "student" : {"tanishk" : "23423", "sanskar" : "7445", "shashwat" : "5573", "ayush" : "96456"} } uname = input("Enter your username : ").lower() # 遍历所有内层字典的键,判断用户名是否存在 if uname in (name for inner_dict in user.values() for name in inner_dict): print("Hello")
方法2:先收集所有用户名到列表再判断
适合需要多次复用用户名列表的场景:
user = { "admin" : {"alex" : "1234", "phil" : "3453", "peter" : "23423", "lucas" : "12133"}, "student" : {"tanishk" : "23423", "sanskar" : "7445", "shashwat" : "5573", "ayush" : "96456"} } uname = input("Enter your username : ").lower() # 收集所有用户名 all_usernames = [] for inner_dict in user.values(): all_usernames.extend(inner_dict.keys()) if uname in all_usernames: print("Hello")
方法3:用any()函数高效判断(推荐)
any()会在找到第一个匹配项后立即停止遍历,性能更优:
user = { "admin" : {"alex" : "1234", "phil" : "3453", "peter" : "23423", "lucas" : "12133"}, "student" : {"tanishk" : "23423", "sanskar" : "7445", "shashwat" : "5573", "ayush" : "96456"} } uname = input("Enter your username : ").lower() # 只要有一个内层字典包含该用户名就返回True if any(uname in inner_dict for inner_dict in user.values()): print("Hello")
进阶:完整的登录校验逻辑
如果要完成完整的登录(校验用户名+密码),可以这样写:
user = { "admin" : {"alex" : "1234", "phil" : "3453", "peter" : "23423", "lucas" : "12133"}, "student" : {"tanishk" : "23423", "sanskar" : "7445", "shashwat" : "5573", "ayush" : "96456"} } uname = input("Enter your username : ").lower() pwd = input("Enter your password: ") # 遍历用户类型和对应的字典 for user_type, inner_dict in user.items(): if uname in inner_dict: if inner_dict[uname] == pwd: print(f"Welcome back, {uname}! You're logged in as {user_type}") else: print("Password is incorrect.") break else: # 循环正常结束(没找到匹配的用户名) print("Username not found.")
内容的提问来源于stack exchange,提问作者Tanishk Raikwar
相关产品推荐
相关产品推荐

