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」比較の前に「continue」があります。したがって、おそらく 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 句に continue があるため、それを削除してください。

于 2013-05-30T16:49:43.100 に答える
0

に到達したためcontinueif 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)

または、2 つのリストと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 に答える