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_alphabetalphabet 长度 不匹配。

您可以通过

非常简单地更正它
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() 方法。