PythonでROT13スクリプトを書いています。文字列を単一文字のリストに分割し、for ループを使用して機能し、各文字を調べて、辞書で翻訳する必要があるかどうかを確認します。
問題は、リスト内の文字が常に置き換えられるとは限らないことです。理由はわかりませんが、一部の文字列しか機能しません。
コードは次のとおりです。
import string
def rot13(m):
Data for ROT13 conversion
alphabet = list("abcdefghijklmnopqrstuvwxyz")
mapping = {}
for letter in alphabet:
mapping[letter] = alphabet[(alphabet.index(letter) + 13)%26]
for letter in alphabet:
mapping[letter.upper()] = alphabet[(alphabet.index(letter) +13)%26].upper()
# Create a list of the characters in order
characters = list(m)
# Go through each character in the list...
for character in characters:
# Check if that character is one that needs to be changed
if character in mapping:
# Test to chcek if it is finding characters correctly (it is)
print "%s to %s" % (character, mapping[character])
# replace the character with a new one (works inconsistently)
characters[characters.index(character)] = mapping[character]
#Bring it all together
result = string.join(characters, "");
return result
print rot13("ABCDEF") # Returns NOPQRS
print rot13("ABCDEFGHIJKLMNOPQRSTUVWXYZ") # Returns original string
大文字のアルファベットの一部を含む最初のテストは、期待どおりに出力されます。ただし、ROT13 関数を使用すると、完全なアルファベットは元の文字列を返すだけです。
問題は 20 行目にあると確信していますcharacters[characters.index(character)] = mapping[character]
。
この行は、リスト内の文字を、最初に構築された rot13 辞書の対応する文字に置き換えることになっていますが、常にそうするとは限りません。
テストしている文字と、辞書に基づいて変更する必要がある文字を出力する直前の行があり、それは常に機能します。しかし、もしそうなら、なぜこの別の行ではないのでしょうか?