0

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

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
4

7 回答 7

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')
于 2013-05-30T16:46:48.650 回答
2

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

于 2013-05-30T16:46:49.450 回答
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'))
于 2013-05-30T17:02:42.543 回答
0

字符串是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
于 2013-05-30T16:48:28.647 回答
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
于 2013-05-30T16:48:57.737 回答
0

因为你没有跳出循环。

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

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

于 2013-05-30T16:49:43.100 回答
0

因为您到达continue,所以if b == 202永远不会到达该语句。

但是,s.replace(old, new)替换所有出现的oldwith 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)
于 2013-05-30T16:57:00.930 回答