Wie kann ich die Indexerror beheben?

stimmen
0

Als ich dieses Programm ausführen (Es soll kodieren und dekodieren Dinge in und aus der Caesar-Chiffre) und entscheiden sich für die decode Option, erhalte ich die Fehlermeldung, dass der String-Index außerhalb des Bereichs liegt. Kann mir jemand sagen, wie dieses Problem zu beheben und mir sagen, warum es passiert? Der Text, den ich für sie zu dekodieren eingegeben war ibmmp und der Schlüssel war 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)
Veröffentlicht am 27/11/2018 um 17:56
quelle vom benutzer
In anderen Sprachen...                            


1 antworten

stimmen
1

Problem: ibmmpund Schlüssel von 1

iWerke, bgibt Ihnen einen Fehler. Hier ist der Grund:

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)

Sie können den Modulo-Operator %beheben Über- / Unterschreitung:

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

Sie können auch verwenden if alphletter < 0:- dies wird keinen Schlüssel handhaben, das ist umschlingen mehrere Male (fe 210) oder negative Tasten-22


einige Optimierungen

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

Ausgabe:

yfyffff
Beantwortet am 27/11/2018 um 18:32
quelle vom benutzer

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