You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将字符串辅音替换为辅音列表第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))

问题排查

  1. 索引越界:辅音列表共21个元素(索引0-20),当处理z(索引20)时,temp +10 =30,超出列表索引范围,直接访问会触发IndexError。
  2. 加密逻辑不符合需求:用户要求z替换为n(索引10),但原代码用temp+10计算的索引无法得到该结果,正确的计算应为(temp -10) % 列表长度,这样z的索引20代入后得到10,对应n。
  3. 解密逻辑错误:解密是加密的逆操作,原代码和加密用了相同的temp+10,无法还原原字符,需改为(temp +10) % 列表长度。
  4. 大小写处理遗漏:原代码未处理大写辅音的加密/解密,输入大写辅音会直接保留,不符合需求。

修改后的代码

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 01:20:20