如何将字符串辅音替换为辅音列表第11个元素?循环越界求助
辅音加密解密的索引越界问题解决
问题背景
给定辅音列表:bcdfghjklmnpqrstvwxyz,要求输入中出现"z"时替换为列表第11个元素"n"(例如输入"zeo",输出应为"nEO")。当前代码在处理列表末尾的辅音时出现索引越界问题,参考代码如下:
def Encryption(s): encstr="" for i in s: if(i in vowels): encstr=encstr+i.upper() elif(i in consonants): temp = consonants.index(i) encstr=encstr+consonants[temp + 10] else: encstr=encstr + i return encstr def Decryption(k): decstr="" for i in k: if(i in VOWELS): decstr=decstr+i.lower() elif(i in consonants): temp = consonants.index(i) decstr=decstr+consonants[temp + 10] else: decstr=decstr+i return decstr #List Of Vowels vowels = ['a', 'e', 'i', 'o', 'u'] VOWELS = [vowel.upper() for vowel in vowels] #List Of Consonants consonants = list("bcdfghjklmnpqrstvwxyz") CONSONANTS = [cons.upper() for cons in consonants] print("Enter the string to Encrypt and decrypt : ") s=input() t=Encryption(s) print(s) print(t) print(Decryption(t))
问题排查
- 索引越界:辅音列表共21个元素(索引0-20),当处理z(索引20)时,
temp +10 =30,超出列表索引范围,直接访问会触发IndexError。 - 加密逻辑不符合需求:用户要求z替换为n(索引10),但原代码用
temp+10计算的索引无法得到该结果,正确的计算应为(temp -10) % 列表长度,这样z的索引20代入后得到10,对应n。 - 解密逻辑错误:解密是加密的逆操作,原代码和加密用了相同的
temp+10,无法还原原字符,需改为(temp +10) % 列表长度。 - 大小写处理遗漏:原代码未处理大写辅音的加密/解密,输入大写辅音会直接保留,不符合需求。
修改后的代码
def Encryption(s): encstr = "" consonant_len = len(consonants) for char in s: lower_char = char.lower() if lower_char in vowels: # 元音转为大写 encstr += char.upper() elif lower_char in consonants: temp = consonants.index(lower_char) # 按需求偏移10位,取模避免索引越界 new_index = (temp - 10) % consonant_len encrypted_char = consonants[new_index] # 保留原字符的大小写 if char.isupper(): encrypted_char = encrypted_char.upper() encstr += encrypted_char else: encstr += char return encstr def Decryption(k): decstr = "" consonant_len = len(consonants) for char in k: lower_char = char.lower() if lower_char in vowels: # 大写元音转为小写 decstr += char.lower() elif lower_char in consonants: temp = consonants.index(lower_char) # 逆操作偏移10位,还原原字符 new_index = (temp + 10) % consonant_len decrypted_char = consonants[new_index] # 保留原字符的大小写 if char.isupper(): decrypted_char = decrypted_char.upper() decstr += decrypted_char else: decstr += char return decstr # 元音列表 vowels = ['a', 'e', 'i', 'o', 'u'] VOWELS = [v.upper() for v in vowels] # 辅音列表 consonants = list("bcdfghjklmnpqrstvwxyz") CONSONANTS = [c.upper() for c in consonants] print("请输入需要加密解密的字符串:") s = input() encrypted = Encryption(s) print(f"原字符串:{s}") print(f"加密后:{encrypted}") print(f"解密后:{Decryption(encrypted)}")
关键修改说明
- 取模运算:用
% len(consonants)确保索引始终在列表范围内,彻底解决越界问题。 - 修正偏移逻辑:加密时用
temp-10满足z→n的需求,解密时用temp+10完成逆操作,保证加密解密的可逆性。 - 完善大小写处理:统一将字符转为小写处理索引,再根据原字符的大小写调整输出结果,支持大小写辅音的加密解密。
内容的提问来源于stack exchange,提问作者sonali anand
相关产品推荐
相关产品推荐

