Jak mohu opravit IndexError?

hlasů
0

Při spuštění tohoto programu (Předpokládá se, že kódování a dekódování věci dovnitř a ven z Caesar šifry), a rozhodnout se pro volbu dekódování, dostanu chybu rčení, že index řetězec je mimo rozsah. Může mi někdo říct, jak to opravit, a řekněte mi, proč se to děje? Text jsem vstoupil na to, aby dekódování bylo ibmmp a klíč byl 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)
Položena 27/11/2018 v 17:56
zdroj uživatelem
V jiných jazycích...                            


1 odpovědí

hlasů
1

Problém: ibmmpa klíč 1

ipráce, bvám dává chybu. Zde je důvod, proč:

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)

Můžete použít modulo operátor %opravit přes / podtečení:

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

Dalo by se také použít if alphletter < 0:- nebude to zvládnout klíče to je obalí vícekrát (FE 210) nebo negativní kláves-22


Některé optimalizace

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

Výstup:

yfyffff
Odpovězeno 27/11/2018 v 18:32
zdroj uživatelem

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