IndexError: list index out of range for the caesar cipher
IndexError: list index out of range for the caesar cipher
我正在制作凯撒密码,当我 运行 代码时出现索引错误。当它是几个字母时,它可以工作并加密消息,但是当我输入十个以上的单词时,它会给我一个索引错误。
shift_key = int(raw_input("Enter in your key shift: 1-9\n>>> "))
alphabet = ['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']
encrypted_alphabet = []
encrypted_message = ''
for i in alphabet[shift_key:]:
encrypted_alphabet.append(i)
input = raw_input("Enter text to be decoded\n>>> ").upper()
input = input.split()
for i in input:
for j in i:
index = alphabet.index(j)
encrypted_message += encrypted_alphabet[index]
encrypted_message += ' '
print encrypted_message
问题出在这两行:
for i in alphabet[shift_key:]:
encrypted_alphabet.append(i)
请注意,alphabet[shift_key:]
切片 列表 alphabet
只获取从 shift_key
开始的那些元素。
换句话说,如果shift_key
是25,例如,那么alphabet[shift_key:]
returns就是['Y','Z']
。由于您将这些附加到 encrypted_alphabet
,因此 encrypted_alphabet
将变为 ['Y','Z']
。但是你想要的也是 rest 附加到 encrypted_alphabet
.
末尾的字母表
简单地说,您的 encrypted_alphabet
和 alphabet
的 长度 不匹配。
您可以通过
非常简单地更正它
for i in alphabet[shift_key:] + alphabet[:shift_key]:
encrypted_alphabet.append(i)
或(更简单)
encrypted_alphabet = alphabet[shift_key:] + alphabet[:shift_key]
但是,如果您想知道正确的方法,请改用内置的字符串方法maketrans
,这要简单得多:
import string
shift_key = int(raw_input("Enter in your key shift: 1-9\n>>> "))
alphabet = string.ascii_uppercase
encrypted_alphabet = alphabet[shift_key:] + alphabet[:shift_key]
caesar = string.maketrans(alphabet,encrypted_alphabet)
input = raw_input("Enter text to be decoded\n>>> ").upper()
print(input.translate(caesar))
快速解释
如代码所示,maketrans
在两个字符串之间创建 翻译 table,将第一个字符映射到另一个。然后,您可以将此翻译 table 提供给每个字符串都具有的 .translate()
方法。
我正在制作凯撒密码,当我 运行 代码时出现索引错误。当它是几个字母时,它可以工作并加密消息,但是当我输入十个以上的单词时,它会给我一个索引错误。
shift_key = int(raw_input("Enter in your key shift: 1-9\n>>> "))
alphabet = ['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']
encrypted_alphabet = []
encrypted_message = ''
for i in alphabet[shift_key:]:
encrypted_alphabet.append(i)
input = raw_input("Enter text to be decoded\n>>> ").upper()
input = input.split()
for i in input:
for j in i:
index = alphabet.index(j)
encrypted_message += encrypted_alphabet[index]
encrypted_message += ' '
print encrypted_message
问题出在这两行:
for i in alphabet[shift_key:]:
encrypted_alphabet.append(i)
请注意,alphabet[shift_key:]
切片 列表 alphabet
只获取从 shift_key
开始的那些元素。
换句话说,如果shift_key
是25,例如,那么alphabet[shift_key:]
returns就是['Y','Z']
。由于您将这些附加到 encrypted_alphabet
,因此 encrypted_alphabet
将变为 ['Y','Z']
。但是你想要的也是 rest 附加到 encrypted_alphabet
.
简单地说,您的 encrypted_alphabet
和 alphabet
的 长度 不匹配。
您可以通过
非常简单地更正它for i in alphabet[shift_key:] + alphabet[:shift_key]:
encrypted_alphabet.append(i)
或(更简单)
encrypted_alphabet = alphabet[shift_key:] + alphabet[:shift_key]
但是,如果您想知道正确的方法,请改用内置的字符串方法maketrans
,这要简单得多:
import string
shift_key = int(raw_input("Enter in your key shift: 1-9\n>>> "))
alphabet = string.ascii_uppercase
encrypted_alphabet = alphabet[shift_key:] + alphabet[:shift_key]
caesar = string.maketrans(alphabet,encrypted_alphabet)
input = raw_input("Enter text to be decoded\n>>> ").upper()
print(input.translate(caesar))
快速解释
如代码所示,maketrans
在两个字符串之间创建 翻译 table,将第一个字符映射到另一个。然后,您可以将此翻译 table 提供给每个字符串都具有的 .translate()
方法。