Spencer Specter
Spencer Specter

Reputation: 11

My Code skips the else statement of If-Else block

I wrote a Caesar cipher using dictionaries. The code works perfectly until a character which is not a part of the dictionary such as a whitespace or comma is entered. I decided to handle those exceptions with an else statement but the code keeps skipping the else statement and returns the error :

"Key Error: ' '".

Actual_Key = {"A":0, "B":1, "C":2, "D":3, "E":4, "F":5, "G":6, "H":7, "I":8, 
"J":9, "K":10, "L":11, "M":12, "N":13, "O":14, "P":15, "Q":16, "R":17, 
"S":18, "T":19, "U":20, "V":21, "W":22, "X":23, "Y":24, "Z":25}

Reverse_Key = {0:"A", 1:"B", 2:"C", 3:"D", 4:"E", 5:"F", 6:"G", 7:"H", 
8:"I", 9:"J", 10:"K", 11:"L", 12:"M", 13:"N", 14:"O", 15:"P", 16:"Q", 
17:"R", 18:"S", 19:"T", 20:"U", 21:"V", 22:"W", 23:"X", 24:"Y", 25:"Z"}

encrypted_message = ""

message = input("Please enter your message: \n> ").upper()
key = int(input("Enter a key number between 0 and 26 \n> "))

for letter in message:
    if letter in message:
        new_value = Actual_Key[letter] + key

        if new_value >= 26:
            new_value = new_value - 26

        citext = str(Reverse_Key[new_value])

        encrypted_message += citext

else:
    encrypted_message += letter

print (encrypted_message)

Upvotes: 0

Views: 140

Answers (3)

Maresh
Maresh

Reputation: 4712

Letter will ALWAYS be in message, as it's coming from it. So your first if statement is always true.

You need to check if letter is in your dictionnary.

for letter in message:
    if letter in Actual_key:
        new_value = Actual_Key[letter] + key

        if new_value >= 26:
            new_value = new_value - 26

        citext = str(Reverse_Key[new_value])

        encrypted_message += citext

    else:
        encrypted_message += letter

print (encrypted_message)

Upvotes: 2

Mureinik
Mureinik

Reputation: 311228

The code is not indented correctly - the else statement needs to be indented under the if, not the for. Currently, the wrong indentation makes it an else clause **for the for clause, which means it will be executed after thefor` loop terminates correctly.

for letter in message:
    if letter in message:
        new_value = Actual_Key[letter] + key

        if new_value >= 26:
            new_value = new_value - 26

        citext = str(Reverse_Key[new_value])

        encrypted_message += citext

    else: # Note the indentation here!
        encrypted_message += letter

Upvotes: 0

thilo_dual
thilo_dual

Reputation: 158

looks like you haven set the right indention. The else-statement should be on the same level than your if statement:

for letter in message:
    if letter in message:
      new_value = Actual_Key[letter] + key

      if new_value >= 26:
        new_value = new_value - 26

      citext = str(Reverse_Key[new_value])

      encrypted_message += citext

    else:
        encrypted_message += letter

print (encrypted_message)

Upvotes: 0

Related Questions