#python-3.x #encryption #index-error
#python-3.x #шифрование #ошибка индекса
Вопрос:
Я изучал python в школе, и я решил выполнить задачу по созданию дешифратора, но вместо ввода суммы, в которой изменяется сообщение, он будет выполнять каждое из них, искать общие слова и выбирать наиболее вероятное дешифрование. Если это не то, что вам нужно, тогда они могут просмотреть каждый. Однако у меня возникла проблема с получением кода для его расшифровки с каждой суммой. Это ошибка, возвращаемая после нечетного возврата из части кода: IndexError: строковый индекс вне диапазона. Я не могу понять, почему он не работает. Это единственный язык программирования, который я знаю, поэтому это может быть очевидно, и я просто не понял. Я не смог найти ответ в Интернете, поэтому, если кто-нибудь найдет решение, я был бы очень благодарен. Заранее спасибо.
import sys
import time
from time import sleep as s
import random
import collections
LETTERS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ'
LETTERS = LETTERS.lower()
global c1, message
c1=int(0)
message = input("Enter the thing you want to decrypt. ")
def decrypt():
global c1, LETTERS, message
decrypted = ''
for counter in range(1,27):
for chars in message:
if chars in LETTERS:
c1 = int(c1 counter)
num = LETTERS.find(chars)
num -= c1
decrypted = LETTERS[num]
s(1)
print(decrypted)
decrypt()
Полная ошибка:
Enter the thing you want to decrypt. ij
hh
hhed
hhedzx
hhedzxsp
hhedzxspjf
hhedzxspjfyt
hhedzxspjfytlf
Traceback (most recent call last):
File "C:UsersTomHuDocumentsDocumentsTomSchoolHomeworkYear 8ComputingPythonEncrypter.py", line 30, in <module>
decrypt()
File "C:UsersTomHuDocumentsDocumentsTomSchoolHomeworkYear 8ComputingPythonEncrypter.py", line 25, in decrypt
decrypted = LETTERS[num]
IndexError: string index out of range
Ответ №1:
В вашем примере длина букв равна 52.
Индексы, которые вы можете использовать с БУКВАМИ (num), должны быть в диапазоне от -52 до 51. Однако в вашем примере число равно -56 перед ошибкой.
Вы можете увидеть это, добавив print(num)
перед decrypted = LETTERS[num]
.
если вы хотите избежать этой проблемы, вы можете сделать по модулю len (БУКВЫ):
import sys
import time
from time import sleep as s
import random
import collections
LETTERS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ'
LETTERS = LETTERS.lower()
length=len(LETTERS)
global c1, message
c1=int(0)
message = input("Enter the thing you want to decrypt. ")
def decrypt():
global c1, LETTERS, message
decrypted = ''
for counter in range(1,27):
for chars in message:
if chars in LETTERS:
c1 = int(c1 counter)
num = LETTERS.find(chars)
num -= c1
num=num%length
decrypted = LETTERS[num]
s(1)
print(decrypted)
decrypt()
С помощью этой модификации вы обязательно будете постоянно указывать действительный индекс. После этого вы можете изменить свой алгоритм, чтобы получить ожидаемый результат.
Комментарии:
1. почему вы используете lower. и не дает непосредственно хорошую строку. экспериментирование?
2. Спасибо! Вы имеете в виду просто вставить его в нижний регистр? Назовите это экспериментированием, а не бесполезностью.