Забавная ошибка ASCI с .replace («x», «w»)

#python

#python

Вопрос:

Я создаю программу, которая принимает предложение и искажает его, пока не будет запущена через «дегарблер»

Вероятно, есть лучший способ сделать это, но я был бы признателен, если бы все показали мне, как исправить то, что я делаю неправильно

 def sencoder (sentence):
    sentence = sentence.replace ("a","h")
    sentence = sentence.replace ("s","j")
    sentence = sentence.replace ("d","k")
    sentence = sentence.replace ("f","l")
    sentence = sentence.replace ("b","g")
    sentence = sentence.replace ("z","t")
    sentence = sentence.replace ("q","y")
    sentence = sentence.replace ("w","u")
    sentence = sentence.replace ("e","i")
    sentence = sentence.replace ("r","o")
    sentence = sentence.replace ("x","p")
    sentence = sentence.replace ("c","b")
    sentence = sentence.replace ("v","n")
    sentence = sentence.replace ("m","m")
    print sentence

def decoder (sentence):
    sentence = sentence.replace ("h","a")
    sentence = sentence.replace ("j","s")
    sentence = sentence.replace ("k","d")
    sentence = sentence.replace ("l","f")
    sentence = sentence.replace ("g","b")
    sentence = sentence.replace ("t","z")
    sentence = sentence.replace ("y","q")
    sentence = sentence.replace ("u","w")
    sentence = sentence.replace ("i","e")
    sentence = sentence.replace ("o","r")
    sentence = sentence.replace ("p","x")
    sentence = sentence.replace ("b","c")
    sentence = sentence.replace ("n","v")
    sentence = sentence.replace ("m","m")
    print sentence

sentence = ""
choice = raw_input ("Do you want to decode or encode: ").lower()   
while sentence != "quit":
    sentence = raw_input("Enter the code: ")
    if choice == "encode":
        decoder(sentence)
    elif choice == "decode":
        sencoder(sentence)
    else:
        print "Please make a valid decision"
 

Справка

Комментарии:

1. В чем проблема? Чего вы ожидаете?

2. О, мои глаза… Попробуйте str.translate или re.sub для таких вещей.

3. Как название соответствует коду? Я не вижу replace(«x»,»w») нигде в коде…

4. Ваша опция encode запускает decoder, а опция decode запускает encoder. Это специально? Обычно опция декодирования запускает декодер, а опция кодирования запускает кодер.

Ответ №1:

Вот подсказка: вместо этого используйте этот translate метод.

 >>> import string

>>> t = string.maketrans("abcdef", "bcdefa")
>>> "abracadabra".translate(t)
'bcrbdbebcrb'

>>> t2 = string.maketrans("bcdefa", "abcdef")
>>> "bcrbdbebcrb".translate(t2)
'abracadabra'
 

Комментарии:

1. Спасибо, по крайней мере, вы помогли мне решить проблему вместо «Мои глаза! Помоги, о боже».

Ответ №2:

Я создаю программу, которая принимает предложение и искажает его, пока не будет запущена через «дегарблер»

Обратите внимание, что это не будет работать с любым видом входного предложения:

 encode ("ah") = "hh"   decode ("hh") = "aa"
 

Если два алфавита могут перекрываться, вам необходимо изменить свой алгоритм, чтобы сохранить частично закодированные данные отдельно от входной строки.

Из вашего примера не очевидно, является ли это проблемой, но я подумал, что лучше указать на это.

Ответ №3:

Ваш сценарий «работает на меня». Возможно, вас беспокоит то, что ваши значения кодирования и декодирования меняются местами?

То есть ввод «encode» вызывает ваш декодер, а ввод «decode» вызывает ваш кодер.

И, как вы видите в комментариях, пожалуйста, используйте translate ! 🙂