3

こんにちは、事前に答えてくれてありがとう、私は PythonChallenge の最初のタスクを実行しようとしていました: http://www.pythonchallenge.com/pc/def/map.html と、コードに関するいくつかの質問があります。私はこのコードが機能することを知っています:

import string
letters = string.ascii_lowercase
uletters = string.ascii_uppercase
text = ("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 x in range(0, 26):
    text = text.replace(letters[x-2], uletters[x])
    print(text.lower())

私はコードを少しいじっていましたが、質問があることに関する私の観察は次のとおりです。 1.実行すると:

text = text.replace(letters[x], uletters[x+2])

「translate」ではなく「trynslyte」などのエラーが発生します。なぜこのシフトはこのような変化をもたらすのでしょうか? 2. 変更したとき: uletters = string.ascii_uppercase

uletters = string.ascii_lowercase

たくさんの「z」と「y」が現れました。繰り返しますが、問題は何ですか?

どうもありがとう

4

4 に答える 4

4

letters[x-2]andxが 0 または 1 のいずれかであると評価すると、最終的にletters[-1]orletters[-2]になります。Python では、それぞれ最後と最後から 2 番目の要素にアクセスします。これが、このステップが機能する理由です。ただし、最後の要素のインデックスより大きいインデックスは同じ効果を持たないため、大きすぎると機能しletters[x+2]ません。x

あなたがする必要があるのは次のようなものです:

letters[(x+2)%len(letters)]

このラップアラウンドを強制します。

于 2013-07-19T16:26:25.183 に答える
1

これを行うより良い方法は、 を使用することですstr.translate()

from string import ascii_lowercase as lc

text = ("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.")

print (text.translate(str.maketrans(lc, lc[2:] + lc[:2])))

エンコーダーを作成するには、引数を次のように入れ替えるだけmaketrans()です。

print (text.translate(str.maketrans(lc[2:] + lc[:2], lc)))
于 2013-07-19T16:55:06.630 に答える
0

ラップアラウンドに対処する必要があります。x-2 が 0 未満の場合、エラーが発生します。

于 2013-07-19T16:28:30.200 に答える