Reputation: 11
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
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
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 the
for` 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
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