为什么索引在这个程序中会越界?

2024-04-26 14:30:19 发布

您现在位置:Python中文网/ 问答频道 /正文

出于某种原因,在运行这个命令并输入26个字母的键时,我在Python2.7中遇到了一个错误。它说列表索引超出范围。任何帮助都将不胜感激。谢谢!(我知道我可以用一个循环来encrypter

#-------------------------#
#     Code Translator     #
#-------------------------#

message = ''
messagearray = []
user = ''
encrypted = []
decrypted = []
keystring = ''
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']
dataset = []
keyarray = []

def encrypter():
    keystring = raw_input("Please paste key: ")
    message = raw_input("Message to Encrypt: ")

    for char in message:
        if char == alphabet[0]:
            messagearray.append(keyarray[0])
        elif char == alphabet[1]:
            messagearray.append(keyarray[1])
        elif char == alphabet[2]:
            messagearray.append(keyarray[2])
        elif char == alphabet[3]:
            messagearray.append(keyarray[3])
        elif char == alphabet[4]:
            messagearray.append(keyarray[4])
        elif char == alphabet[5]:
            messagearray.append(keyarray[5])
        elif char == alphabet[6]:
            messagearray.append(keyarray[6])
        elif char == alphabet[7]:
            messagearray.append(keyarray[7])
        elif char == alphabet[8]:
            messagearray.append(keyarray[8])
        elif char == alphabet[9]:
            messagearray.append(keyarray[9])
        elif char == alphabet[10]:
            messagearray.append(keyarray[10])
        elif char == alphabet[11]:
            messagearray.append(keyarray[11])
        elif char == alphabet[12]:
            messagearray.append(keyarray[12])
        elif char == alphabet[13]:
            messagearray.append(keyarray[13])
        elif char == alphabet[14]:
            messagearray.append(keyarray[14])
        elif char == alphabet[15]:
            messagearray.append(keyarray[15])
        elif char == alphabet[16]:
            messagearray.append(keyarray[16])
        elif char == alphabet[17]:
            messagearray.append(keyarray[17])
        elif char == alphabet[18]:
            messagearray.append(keyarray[18])
        elif char == alphabet[19]:
            messagearray.append(keyarray[19])
        elif char == alphabet[20]:
            messagearray.append(keyarray[20])
        elif char == alphabet[21]:
            messagearray.append(keyarray[21])
        elif char == alphabet[22]:
            messagearray.append(keyarray[22])
        elif char == alphabet[23]:
            messagearray.append(keyarray[23])
        elif char == alphabet[24]:
            messagearray.append(keyarray[24])
        elif char == alphabet[25]:
            messagearray.append(keyarray[25])

    print ''.join(messagearray) 




def decrypter():
    keystring = raw_input("Please paste key: ")
    message = raw_input("Message to Decrypt: ")





def outputM():
    print decrypted

def userChoice():
    user = raw_input("Encrypt or Decrypt?")
    if user.upper() == "ENCRYPT":
        encrypter()
    elif user.upper() == "DECRYPT":
        decrypter()
    else:
        print "Please enter a valid command."
        userChoice()

for char in keystring:
    keyarray.append(char)

userChoice()

以下是我得到的完整回溯:

Traceback (most recent call last):
  File "translate.py", line 102, in <module>
    userChoice()
  File "translate.py", line 92, in userChoice
    encrypter()
  File "translate.py", line 43, in encrypter
    messagearray.append(keyarray[11])
IndexError: list index out of range

Tags: inmessageinputrawdefelifappendchar
2条回答

问题在于:

for char in keystring:
    keyarray.append(char)

keystring为空,因此keyarray也将保持空。为了不使用IndexError,您需要一个与字母表一样长的键串(因为基本上您只是在替换字符)

问题在于:

def decrypter():
    keystring = raw_input("Please paste key: ")
    message = raw_input("Message to Decrypt: ")

将值赋给局部变量,因此全局变量保持为空。如果要修改全局变量,必须说明:

def decrypter():
    global keystring, message
    keystring = raw_input("Please paste key: ")
    message = raw_input("Message to Decrypt: ")

这同样适用于encrypter。你知道吗

另外,在接受一些输入之前,不能创建keyarray!你知道吗


代码还有许多其他问题。你不可能认为做所有的手动索引是最好的方法。如果你想支持128个字符的字母表呢?你知道吗

使用循环:

for char in message:
    for i, c in enumerate(alphabet):
        if char == c:
            messagearray.append(keyarray[i])

(而不是那些重复的台词)。你知道吗

此外,字符串已经提供了一种方法来执行您正试图执行的操作。它叫做^{}。你知道吗

你可以简单地做:

import string

table = str.maketrans(string.ascii_lowercase, keystring)

然后使用:

decrypted_text = some_encrypted_text.translate(table)

运行示例:

In [1]: import string
   ...: alphabet = string.ascii_lowercase
   ...: table = str.maketrans(alphabet, alphabet[3:]+alphabet[:3])
   ...: 

In [2]: 'hello'.translate(table)
Out[2]: 'khoor'

以上是python3+。在python2.7中,必须使用^{}而不是str.maketrans。所以你必须:

In [1]: import string
   ...: alphabet = string.ascii_lowercase
   ...: table = string.maketrans(alphabet, alphabet[3:]+alphabet[:3])
   ...: 

In [2]: 'hello'.translate(table)
Out[2]: 'khoor'

相关问题 更多 >