Reverse string translation with dictionary

Lukasz

I am trying to reverse the use of the translate function. I pass a dictionary into str.maketrans, which translates the original string correctly, as per the dictionary.

cipher_dictionary = {'a': 'h5c', 'b': 'km3', 'c': '5fv'}

def cipher(text):
    trans = str.maketrans(cipher_dictionary)
    return text.translate(trans)

Above is the sample dictionary, together with the function that I use to translate strings. Translating abc gives me h5ckm35fv, which is desired.

Now, to reverse it, I am trying to use the following function.

def decipher(text):
    reverse = {value: key for key, value in cipher_dictionary.items()}
    trans = str.maketrans(reverse)
    return text.translate(trans)

Using it raises an error.

Traceback (most recent call last):
  File "C:\Users\lukas\Desktop\cipher.py", line 21, in <module>
    deciphered = decipher(ciphered)
  File "C:\Users\lukas\Desktop\cipher.py", line 13, in decipher
    trans = str.maketrans(reverse)
ValueError: string keys in translate table must be of length 1

I am aware that this is because the values in cipher_dictionary aren't equal length to a, b and c. How can I go about rewriting the decipher function, to make h5ckm35fv translate back into abc?

cipher_dictionary = {'a': 'h5c', 'b': 'km3', 'c': '5fv'}


def cipher(text):
    trans = str.maketrans(cipher_dictionary)
    return text.translate(trans)


def decipher(text):
    reverse = {value: key for key, value in cipher_dictionary.items()}
    trans = str.maketrans(reverse)
    return text.translate(trans)

if __name__ == '__main__':
    text_to_cipher = 'abc'
    ciphered = cipher(text_to_cipher)
    print(ciphered)

    deciphered = decipher(ciphered)
    print(deciphered)

Running any of the functions provided in answers works perfectly, except for when there is white space in the input.

Text to cipher: some white space
Ciphered text: px3h54oa4b83 ky6u1v0t6yq3b83 px3sy9h5c5fvb83
Traceback (most recent call last):
  File "C:\Users\Lukasz\Desktop\Python\Cipher\cip.py", line 45, in <module>
    deciphered = decipher(ciphered)
  File "C:\Users\Lukasz\Desktop\Python\Cipher\cip.py", line 36, in decipher
    decoded_text = ''.join(reverse[text[i:i+3]] for i in range(0, len(text), 3))
  File "C:\Users\Lukasz\Desktop\Python\Cipher\cip.py", line 36, in <genexpr>
    decoded_text = ''.join(reverse[text[i:i+3]] for i in range(0, len(text), 3))
KeyError: ' ky'
pramod
def decipher(sentence):
    reverse = {value: key for key, value in cipher_dictionary.items()}
    decoded_text = ' '.join(''.join(reverse[word[i:i+3]] for i in range(0, len(word), 3)) for word in sentence.split(' '))
    return decoded_text

Assuming that every letter is being encoded into a set of 3 letters.

Collected from the Internet

Please contact [email protected] to delete if infringement.

edited at
0

Comments

0 comments
Login to comment

Related