字符串索引超出范围错误?

时间:2013-05-30 16:42:30

标签: python string indexing

你好我理解为什么字符串索引被列为'超出范围'有点困难。考虑我在这段代码中试图翻译的字符串:

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

7 个答案:

答案 0 :(得分:4)

你永远不会在循环结束时到达break语句,因为你首先点击continue并跳转到下一次迭代。只需取出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')

答案 1 :(得分:2)

在打破“if”比较之前有一个“继续”。所以它可能永远不会到达if,它永远不会破坏

答案 2 :(得分:0)

String是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

答案 3 :(得分:0)

您的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

答案 4 :(得分:0)

因为你没有摆脱循环。

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

如果你到达其他地方而不是每次都这样做,你只会进行测试。 取消代码的最后3行以使其正常运行。 如果您仍然遇到问题那是因为您已继续使用else子句:将其删除。

答案 5 :(得分:0)

由于您到达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)

答案 6 :(得分:0)

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

from string import maketrans
if len(a) >= 202:
    print a[:202].translate(maketrans('koe', 'mqg')) + a[202:]

虽然我怀疑b只是要检查你是否在字符串的末尾,所以可能只是:

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