如何解决Python3列表调用lower()的AttributeError及大小写不敏感检查
解决AttributeError: 'list' object has no attribute 'lower' 并实现大小写不敏感的用户名检查
首先,咱们先搞清楚你遇到的错误:AttributeError: 'list' object has no attribute 'lower'——这是因为lower()是字符串专属的方法,你不能直接拿它去调用整个列表。你原来的代码里直接写current_users.lower()和new_users.lower(),相当于让列表去做只有字符串能做的事,Python肯定会报错啦。
你的需求是要忽略大小写检查新用户名是否已存在,那正确的思路应该是:把所有现有用户名统一转成小写(或者大写),然后把每个新用户名也转成相同的大小写,再去对比。这样不管原用户名是大写、小写还是混合,对比的时候都是统一格式,自然就实现了大小写不敏感。
下面是修正后的代码,两种实现方式供你选:
方式一:用列表存储小写用户名
current_users = ['mohammad', 'shervin' , 'ali', 'oskol' , 'pro_gamer'] new_users = ['ali', 'ahmad', 'shervin', 'lara', 'helena'] # 把现有用户名逐个转成小写,生成新列表 lowercase_current_users = [user.lower() for user in current_users] for new_user in new_users: # 把当前新用户名也转成小写,再去对比 if new_user.lower() in lowercase_current_users: print(f"{new_user} You must change your user name.") else: print(f"{new_user} user name is available")
方式二:用集合优化查找效率(推荐用户多的时候用)
如果你的用户列表比较长,用集合来存储小写用户名会更高效——集合的成员查找速度比列表快很多:
current_users = ['mohammad', 'shervin' , 'ali', 'oskol' , 'pro_gamer'] new_users = ['ali', 'ahmad', 'shervin', 'lara', 'helena'] # 转成集合,查找效率更高 lowercase_current_users = {user.lower() for user in current_users} for new_user in new_users: if new_user.lower() in lowercase_current_users: print(f"{new_user} You must change your user name.") else: print(f"{new_user} user name is available")
代码解释
- 列表推导式
[user.lower() for user in current_users](或者集合推导式{user.lower() for user in current_users})会遍历原列表里的每个用户名,把它们都转成小写,生成一个统一格式的容器。 - 遍历新用户列表时,每个新用户名也转成小写,再去统一格式的容器里查找——这样就完全忽略了原用户名的大小写差异,实现了你要的需求。
内容的提问来源于stack exchange,提问作者Mohammad Amin Ansari
相关产品推荐
相关产品推荐

