Python 字符串索引超出范围错误? 你好,我很难理解为什么字符串索引被列为“超出范围”。考虑我在这个代码中试图翻译的字符串: a = str("g fmnc wms bgblr rpylqjyrc gr zw fylb. rfyrq ufyr amknsrcpq ypc dmp. bmgle gr gl zw fylb gq glcddgagclr ylb rfyr'q ufw rfgq rcvr gq qm jmle. sqgle qrpgle.kyicrpylq() gq pcamkkclbcb. lmu ynnjw ml rfc spj.") b = 0 while True: if a[b] == str("k"): a.replace("k", "m") b = b + 1 #Methodically checks each string for a 'k' and replaces it with a 'm' elif a[b] == str("o"): a.replace("o", "q") b = b + 1#Checks for an 'o' and replaces with 'q' elif a[b] == str("e"): a.replace("e", "g") b = b + 1 else: b = b + 1 continue if b == 202: print(a) break

Python 字符串索引超出范围错误? 你好,我很难理解为什么字符串索引被列为“超出范围”。考虑我在这个代码中试图翻译的字符串: a = str("g fmnc wms bgblr rpylqjyrc gr zw fylb. rfyrq ufyr amknsrcpq ypc dmp. bmgle gr gl zw fylb gq glcddgagclr ylb rfyr'q ufw rfgq rcvr gq qm jmle. sqgle qrpgle.kyicrpylq() gq pcamkkclbcb. lmu ynnjw ml rfc spj.") b = 0 while True: if a[b] == str("k"): a.replace("k", "m") b = b + 1 #Methodically checks each string for a 'k' and replaces it with a 'm' elif a[b] == str("o"): a.replace("o", "q") b = b + 1#Checks for an 'o' and replaces with 'q' elif a[b] == str("e"): a.replace("e", "g") b = b + 1 else: b = b + 1 continue if b == 202: print(a) break,python,string,indexing,Python,String,Indexing,您永远不会在循环结束时到达break语句,因为您首先点击continue,然后跳到下一个迭代。只需取出继续,您就应该准备好了 else: b = b + 1 if b == 202: print(a) break 我还建议不要在这里使用像202这样的“神奇”数字。相反,使用len函数动态确定您是否在字符串末尾: if b == len(a)-1: break 或者更好地利用Python中可以轻松迭代字符串的事实: for ch in

您永远不会在循环结束时到达
break
语句,因为您首先点击
continue
,然后跳到下一个迭代。只需取出
继续
,您就应该准备好了

else:
    b = b + 1
    if b == 202:
        print(a)
        break

我还建议不要在这里使用像
202
这样的“神奇”数字。相反,使用
len
函数动态确定您是否在字符串末尾:

if b == len(a)-1:
    break
或者更好地利用Python中可以轻松迭代字符串的事实:

for ch in a:
    # Do stuff

正如其他人在评论中所说,您的逻辑也有缺陷(
replace
无论如何只会遍历整个字符串!),并且您不需要所有这些
str(…)
调用。您的整个功能可以重写为:

newstring = ''
for ch in a:
    if ch == 'k':
        newstring += 'm'
    elif ch == 'o':
        newstring += 'q'
    elif ch == 'e':
        newstring += 'g'
    else:
        newstring += ch
print newstring
或者更好的方法是,按照预期的方式使用
replace
功能:

print a.replace('k', 'm').replace('o', 'q').replace('e','g')

您永远不会在循环结束时到达
break
语句,因为您首先点击
continue
,然后跳到下一个迭代。只需取出
继续
,您就应该准备好了

else:
    b = b + 1
    if b == 202:
        print(a)
        break

我还建议不要在这里使用像
202
这样的“神奇”数字。相反,使用
len
函数动态确定您是否在字符串末尾:

if b == len(a)-1:
    break
或者更好地利用Python中可以轻松迭代字符串的事实:

for ch in a:
    # Do stuff

正如其他人在评论中所说,您的逻辑也有缺陷(
replace
无论如何只会遍历整个字符串!),并且您不需要所有这些
str(…)
调用。您的整个功能可以重写为:

newstring = ''
for ch in a:
    if ch == 'k':
        newstring += 'm'
    elif ch == 'o':
        newstring += 'q'
    elif ch == 'e':
        newstring += 'g'
    else:
        newstring += ch
print newstring
或者更好的方法是,按照预期的方式使用
replace
功能:

print a.replace('k', 'm').replace('o', 'q').replace('e','g')

在中断“如果”比较之前有一个“继续”。因此,它可能永远不会到达if,也永远不会中断

在中断“if”比较之前有一个“continue”。所以它可能永远不会到达if,也永远不会中断字符串是python中的一个序列,您可以对其进行迭代

其次,由于字符串是不可变的,因此
str.replace
不会修改
a
,它只返回一个新字符串

a = "g fmnc wms bgblr rpylqjyrc gr zw fylb. rfyrq ufyr amknsrcpq ypc dmp. bmgle gr gl zw fylb gq glcddgagclr ylb rfyr'q ufw rfgq rcvr gq qm jmle. sqgle qrpgle.kyicrpylq() gq pcamkkclbcb. lmu ynnjw ml rfc spj."

for char in a:      
    if char == "k":
        a = a.replace("k", "m")  #assign the new string back to `a`
    elif char == "o":
        a = a.replace("o", "q")
    elif char == "e":
        a = a.replace("e", "g")
print a

字符串是python中的一个序列,您可以对其进行迭代

其次,由于字符串是不可变的,因此
str.replace
不会修改
a
,它只返回一个新字符串

a = "g fmnc wms bgblr rpylqjyrc gr zw fylb. rfyrq ufyr amknsrcpq ypc dmp. bmgle gr gl zw fylb gq glcddgagclr ylb rfyr'q ufw rfgq rcvr gq qm jmle. sqgle qrpgle.kyicrpylq() gq pcamkkclbcb. lmu ynnjw ml rfc spj."

for char in a:      
    if char == "k":
        a = a.replace("k", "m")  #assign the new string back to `a`
    elif char == "o":
        a = a.replace("o", "q")
    elif char == "e":
        a = a.replace("e", "g")
print a
您的
continue
正在继续循环,这样就永远不会到达
if b==202
语句。 试试这个:

a = str("g fmnc wms bgblr rpylqjyrc gr zw fylb. rfyrq ufyr amknsrcpq ypc dmp. bmgle gr gl zw fylb gq glcddgagclr ylb rfyr'q ufw rfgq rcvr gq qm jmle. sqgle qrpgle.kyicrpylq() gq pcamkkclbcb. lmu ynnjw ml rfc spj.")
b = 0
while True:
    if a[b] == str("k"):
        a.replace("k", "m")
        b = b + 1
    elif a[b] == str("o"):
        a.replace("o", "q")
        b = b + 1
    elif a[b] == str("e"):
        a.replace("e", "g")
        b = b + 1
    else:
        b = b + 1
        #continue
    if b == 202:
        print(a)
        break
您的
continue
正在继续循环,这样就永远不会到达
if b==202
语句。 试试这个:

a = str("g fmnc wms bgblr rpylqjyrc gr zw fylb. rfyrq ufyr amknsrcpq ypc dmp. bmgle gr gl zw fylb gq glcddgagclr ylb rfyr'q ufw rfgq rcvr gq qm jmle. sqgle qrpgle.kyicrpylq() gq pcamkkclbcb. lmu ynnjw ml rfc spj.")
b = 0
while True:
    if a[b] == str("k"):
        a.replace("k", "m")
        b = b + 1
    elif a[b] == str("o"):
        a.replace("o", "q")
        b = b + 1
    elif a[b] == str("e"):
        a.replace("e", "g")
        b = b + 1
    else:
        b = b + 1
        #continue
    if b == 202:
        print(a)
        break

因为你没有打破循环

else:
    b = b + 1
    continue
    if b == 202:
        print a
        break

只有在到达else时才进行测试,而不是每次取消插入代码的最后3行以使其正常工作如果您仍然遇到问题那是因为您在else子句中继续了:删除它。

因为您没有脱离循环

else:
    b = b + 1
    continue
    if b == 202:
        print a
        break

只有在到达else时才进行测试,而不是每次取消插入代码的最后3行以使其正常工作如果您仍然遇到问题,那是因为您在else子句中使用了continue:删除它。

因为您到达了
continue
,所以永远不会到达
If b==202
语句

但是,
s.replace(old,new)
将所有出现的
old
替换为
new
,因此您无需对其进行迭代:

a = "g fmnc wms bgblr rpylqjyrc gr zw fylb. rfyrq ufyr amknsrcpq ypc dmp. bmgle gr gl zw fylb gq glcddgagclr ylb rfyr'q ufw rfgq rcvr gq qm jmle. sqgle qrpgle.kyicrpylq() gq pcamkkclbcb. lmu ynnjw ml rfc spj."

a = a.replace('k', 'm')
a = a.replace('o', 'q')
a = a.replace('e', 'g')
然而,这是乏味的。您可以创建替换词典:

replacements = {'k': 'm', 'o': 'q', 'e': 'g'}
for old, new in replacements.items():
    a = a.replace(old, new)
或者,您也可以创建两个列表并
zip
它们:

olds, news = ['k', 'o', 'e'], ['m', 'q', 'g']
for old, new in zip(olds, news):
    a = a.replace(old, new)

由于到达了
continue
,因此永远不会到达
if b==202
语句

但是,
s.replace(old,new)
将所有出现的
old
替换为
new
,因此您无需对其进行迭代:

a = "g fmnc wms bgblr rpylqjyrc gr zw fylb. rfyrq ufyr amknsrcpq ypc dmp. bmgle gr gl zw fylb gq glcddgagclr ylb rfyr'q ufw rfgq rcvr gq qm jmle. sqgle qrpgle.kyicrpylq() gq pcamkkclbcb. lmu ynnjw ml rfc spj."

a = a.replace('k', 'm')
a = a.replace('o', 'q')
a = a.replace('e', 'g')
然而,这是乏味的。您可以创建替换词典:

replacements = {'k': 'm', 'o': 'q', 'e': 'g'}
for old, new in replacements.items():
    a = a.replace(old, new)
或者,您也可以创建两个列表并
zip
它们:

olds, news = ['k', 'o', 'e'], ['m', 'q', 'g']
for old, new in zip(olds, news):
    a = a.replace(old, new)

请注意,编写代码的Python方式(如果我正确理解其意图)是:

虽然我怀疑
b
只是为了检查您是否在字符串末尾,所以可能只是:

print a.translate(maketrans('koe', 'mqg'))

请注意,编写代码的Python方式(如果我正确理解其意图)是:

虽然我怀疑
b
只是为了检查您是否在字符串末尾,所以可能只是:

print a.translate(maketrans('koe', 'mqg'))

您不需要在这里将字符串转换为字符串(只需使用
==“k”
)。啊,好的python挑战<代码>a.replace(…)是一个不可操作的。。。。因此,我猜想您的计数将不正确您不需要在这里将字符串转换为字符串(只需使用
==“k”
)。啊,好的老python挑战<代码>a.replace(…)是一个不可操作的。。。。所以我想你的计数会是incorrect@EfeEsenwa使用
a=a.replace(“k”,“m”)
,它会将新字符串重新分配回
a
。请参阅我的解决方案。@EfeEsenwa使用
a=a.replace(“k”,“m”)
,它会将新字符串重新分配回
a
。看看我的解决方案。