So, this letter substitution cipher shows an error whenever there is a space (whitespace) in the input/phrase,to be encoded.
Here is my code: Im quite new to python so it would be helpful for any suggestions whatsoever.
from string import ascii_lowercase
import random
EXAMPLE_KEY = ''.join(sorted(ascii_lowercase, key=lambda _:random.random()))
def encode(plaintext, key):
    return ''.join(key[ascii_lowercase.index(char)] for char in plaintext)
def decode(plaintext, key):
    return ''.join(ascii_lowercase[key.index(char)] for char in plaintext)
original = input("PLease enter a phrase: ")
encoded = encode(original, EXAMPLE_KEY)
decoded = decode(encoded, EXAMPLE_KEY)
print("The original is:", original) 
print("Encoding it with the key:", EXAMPLE_KEY)
print("Gives:", encoded)
print("Decoding it by the same key gives:", decoded)
Note this isn’t a Caesar Cipher, simply randomly changing the letters to other letters. Thank you
Advertisement
Answer
ascii_lowercase does not contain a space, so ascii_lowercase.index(char) is a ValueError.
One reasonable approach is to just catch this error and return the same character. That would require breaking your join call out into a loop. You could shoehorn an if char in ascii_lowercase into there to keep it in one line, but that would be pretty ugly.
EDIT: like this
def encode(plaintext, key):
  ret = ''
  for char in plaintext:
     try:
       ret += key[ascii_lowercase.index(char)]
     except ValueError:
       ret += char
  return ret
