如何解决Python中‘AttributeError: 'list' object has no attribute 'find'’错误
解决AttributeError: 'list' object has no attribute 'find'问题
嘿,我来帮你搞定这个错误!咱们先拆解问题根源,再给你修复好的代码。
错误为啥会出现?
你看代码里这行:p = aplha.find(a)——这里犯了个拼写错误!你之前定义的字符串变量是alpha(a-l-p-h-a),结果写成了aplha(a-p-l-h-a),把l和p搞反了。
如果之前你不小心在测试时把aplha定义成了列表(比如误写过aplha = ['a','b',...]),那就会触发这个错误——因为列表确实没有find()方法,只有字符串才有这个方法用来查找字符位置。
另外,就算拼写对了,原代码也有小问题:比如输入大写字母或者非字母字符的话,find()会返回-1,后续加密逻辑就会出错。
修复后的完整代码
我不仅帮你修正了拼写错误,还完善了加密逻辑(实现标准的凯撒密码移位),加上了输入校验:
from random import randint alpha = 'abcdefghijklmnopqrstuvwxyz' # 生成1-25的密钥(选26的话移位后等于没加密,意义不大) key = randint(1, 25) print(f"生成的加密密钥是: {key}") a = input('请输入一个英文字母: ').lower() # 统一转小写,兼容大写输入 # 先检查输入是否有效 if a not in alpha: print("抱歉,请输入有效的英文字母哦!") else: # 执行加密:找到字符位置后移位,取模26实现循环 char_pos = alpha.find(a) encrypted_pos = (char_pos + key) % 26 encrypted_char = alpha[encrypted_pos] print(f"加密后的字符是: {encrypted_char}")
额外小提示
- 用
%26是为了实现循环移位:比如字母z(位置25)加1后变成26,取模26得到0,对应字母a,符合凯撒密码的循环逻辑。 - 加入
lower()是为了兼容用户输入大写字母的情况,让代码更健壮。 - 输入校验能避免用户输入数字、符号等无效内容时出现异常。
内容的提问来源于stack exchange,提问作者Vedant Rane
相关产品推荐
相关产品推荐

