Como posso corrigir o IndexError?

votos
0

Quando eu executar este programa (Supõe-se para codificar e decodificar as coisas dentro e fora da cifra de César) e optar pela opção de decodificação, eu recebo o erro dizendo que o índice de corda está fora do intervalo. Alguém pode me dizer como corrigir isso e me diga por que está acontecendo? O texto entrei para ele para decodificar foi ibmmp ea chave foi 1.Thanks.

alphabet = abcdefghijklmnopqrstuvwxyz
encdec = input(Would you like to encode or decode a message? )
if encdec == decode:
    keyyn = input(Do you know the key to your encoded text? (Y/N) )
    if keyyn == Y:
        plaintext = input(Please type in your text )
        text = plaintext
        key = int(input(What is the key? ))
        for i in range(len(plaintext)):
            letter = plaintext[i]
            alphletter = alphabet.find(letter)
            alphletter = alphletter - key
            if alphletter < 0 or alphletter == 0:
                alphletter = alphletter + 26
                letter = alphabet[alphletter]
                plaintext = plaintext + letter
    else:
        letter = alphabet[alphletter]
        plaintext = plaintext + letter
    print(plaintext.strip(text))
else:
    print(This program is unable to decode a message without the key)
Publicado 27/11/2018 em 17:56
fonte usuário
Em outras línguas...                            


1 respostas

votos
1

Problema: ibmmpe chave de 1

iobras, bdá-lhe um erro. Aqui está o porquê:

alphletter = alphabet.find(letter)              #  ==> 1
alphletter = alphletter - key                   #  ==> 0
if alphletter < 0 or alphletter == 0:           #  ==> True
    alphletter = alphletter + 26                    #   ==> 26 
letter = alphabet[alphletter]                   #  only has indexes from 0 to 25
plaintext = plaintext + letter                  #   ~~~~ crash ~~~~
# (also: indentation error for the last 2 lines)

Você pode usar o módulo-operador %para corrigir over / underflow:

alphletter = (alphletter - key) % 26   # for -1 : 25

Você também pode usar if alphletter < 0:- isso não vai lidar com chaves isso é envolver em torno várias vezes (fe 210) ou chaves negativas-22


algumas otimizações

# create a mapping dictionary so we do not need index()
alph = "abcdefghijklmnopqrstuvwxyz"
len_alph = len(alph)

d = {c:i for i,c in enumerate(alph)}                  # mapping char to index
d.update( {v:k for k,v in d.items()} )                # mapping index to char
d.update( {c:i for i,c in enumerate(alph.upper())} )  # mapping CHAR to index

def encode(text,key):
    indexes = [d.get(c,"?") for c in text]      # only mapped things, others get ?
    # if ? use ? else lookup the correct replacement using % to make the index
    # wrap around if above/below the index into alph 
    return ''.join(d.get((i+key)%len_alph if i != "?" else "?","?") for i in indexes)

def decode(text,key):
    return encode(text,-key)


print(encode("tataaaa",5))

Saída:

yfyffff
Respondeu 27/11/2018 em 18:32
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more