2015-09-12 4 views
1

По какой-то причине я получаю сообщение об ошибке в python 2.7 при запуске и вводе в свой 26-буквенный ключ. В нем говорится, что индекс списка за пределами допустимого диапазона. Любая помощь будет принята с благодарностью. Благодаря! (И я знаю, что я мог бы использовал петлю для 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 
+0

Что такое трассировка? –

+0

Пожалуйста: 'import string; alphabet = string.ascii_lowercase'. – Bakuriu

+0

@ DanielePantaleone, только что опубликованный. Благодарю. – Ryrysmithers

ответ

2

Проблема здесь:

for char in keystring: 
    keyarray.append(char) 

keystring является пустым, поэтому keyarray останется пустым. Для того, чтобы не иметь IndexError вам потребуется KeyString столько, сколько больше как алфавит (так как в основном вы просто подставив символов)

+0

Большое вам спасибо! Я боролся с этим некоторое время. Я приму ответ, как только истечет срок. – Ryrysmithers

+0

Похоже, это, вероятно, должно было быть частью decrypter() –

+0

Похож. Действительно, вы должны изменить свой код, чтобы всегда запрашивать ключ, а затем попросить расшифровать или зашифровать. Вы также можете найти интересное: https://en.wikipedia.org/wiki/Substitution_cipher (это то, что вы пытаетесь построить, я думаю) –

1

Проблема заключается в том, что в:

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

вы присваиваете значения в local, поэтому глобальные остаются пустыми. Если вы хотите изменить глобальные переменные, Вы должны указать так:

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]) 

(Вместо всех этих повторяющихся строк).

Кроме того, строки уже предоставляют способ делать именно то, что вы пытаетесь сделать. Это называется translate.

Вы могли бы просто сделать:

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 вы должны использовать string.maketrans вместо 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' 
+0

Правда, но также верно, что decrypter(), который должен инициализировать keystring, не гарантируется выполнение, следовательно, клавиша может оставаться пустой и с объявлением глобальной переменной. –

Смежные вопросы