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
。看看我的解决方案。