Python列表索引越界问题求助:字母右移加密程序报错排查
问题排查与解决
错误原因
出现IndexError是因为当输入字符为z时,alphabet.index(y)返回25(string.ascii_lowercase是a到z共26个字符,索引范围0-25),加1后得到26,超出了列表的最大索引25,直接触发越界错误。
修复方案
方案1:基于原代码调整
先解决越界问题,同时修正循环中变量修改无效的问题:
import string alphabet = list(string.ascii_lowercase) codelist = [] code = input("input text message: ") # 直接遍历输入字符,无需提前转列表 for char in code: if char == " ": # 空格直接保留 codelist.append(char) elif char in alphabet: # 用取模运算处理z的循环移位,(索引+1)对26取模 idx = alphabet.index(char) new_char = alphabet[(idx + 1) % 26] codelist.append(new_char) # 拼接并输出结果 print(''.join(codelist))
方案2:更高效的写法(推荐)
利用ASCII码直接计算,无需遍历字母表,逻辑更简洁:
code = input("input text message: ") result = [] for char in code: if char == " ": result.append(char) elif 'a' <= char <= 'z': # 计算ASCII码,z的话转回a new_ord = ord(char) + 1 if new_ord > ord('z'): new_ord = ord('a') result.append(chr(new_ord)) print(''.join(result))
额外说明
原代码里的嵌套循环完全没必要,不仅效率低,而且修改循环变量x不会改变codelist里的元素——x只是列表元素的临时副本,修改它对原列表没有任何影响。上面的方案直接处理每个字符并添加到结果列表,逻辑更清晰。
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

