str.replace () проблема шифрования программы Python - PullRequest
0 голосов
/ 24 сентября 2018

У меня есть эта программа, где я хочу преобразовать обычное сообщение в зашифрованное.В программе она заменяет каждую букву противоположной.Когда он меняется с c = c.replace('n','m'), он заменяет все те, которые он заменял ранее.

def convert(c):
    c = c.replace('a', 'z')
    c = c.replace('b', 'y')
    c = c.replace('c', 'x')
    c = c.replace('d', 'w')
    c = c.replace('e', 'v')
    c = c.replace('f', 'u')
    c = c.replace('g', 't')
    c = c.replace('h', 's')
    c = c.replace('i', 'r')
    c = c.replace('j', 'q')
    c = c.replace('k', 'p')
    c = c.replace('l', 'o')
    c = c.replace('m', 'n')
    c = c.replace('n', 'm')
    c = c.replace('o', 'l')
    c = c.replace('p', 'k')
    c = c.replace('q', 'j')
    c = c.replace('r', 'i')
    c = c.replace('s', 'h')
    c = c.replace('t', 'g')
    c = c.replace('u', 'f')
    c = c.replace('v', 'e')
    c = c.replace('w', 'd')
    c = c.replace('x', 'c')
    c = c.replace('y', 'b')
    c = c.replace('z', 'a')
    return c
print(convert('the quick brown fox jumps over the lazy dog'))

И вывод:

ghe jfick bildm flc jfmkh leei ghe laab dlg

Он не преобразует все буквы.Может кто-нибудь, пожалуйста, помогите ??

Ответы [ 2 ]

0 голосов
/ 24 сентября 2018

Давайте рассмотрим, что происходит в этом коде.Притворяться, что c - это строка "yabz."

c = "yabz"

Заменить все вхождения "a" на "z".

c = "yzbz"

Заменить все вхождения "b" на "y".«

c = "yzyz"

Теперь, когда вы начинаете заменять« y »и« z », некоторые буквы возвращаются к тому, что начинались как:

c = c.replace("y","b") #c is now "bzbz"
c = c.replace("z","a") #c is now "baba"

В результате выПреобразуйте буквы в первой половине алфавита в буквы во второй половине правильно, но вы случайно изменили их обратно.Из ваших выводов видно, что из-за этого ни одна буква во второй половине алфавита не отображается.Поскольку это выглядит как упражнение, вы должны попытаться решить проблему самостоятельно, но вот возможное решение:

s = "I am noob"
import string   
letters = string.ascii_lowercase
# construct a dictionary mapping from a letter to its dual opposite starting from the end
# of the alphabet table
rep_dict = dict(zip(letters, letters[::-1]))
# use the dictionary to replace the letters
''.join(map(rep_dict.get, s.replace(" ", "").lower()))
# 'rznmlly'

Источник: https://stackoverflow.com/a/42048527/8084393

0 голосов
/ 24 сентября 2018

вы должны использовать str.translate(), поскольку он принимает отображение и применяет все символы одновременно:

def convert(c):
    return c.translate(mapping)

Вы можете сделать свое отображение следующим образом:

mapping = {
    ord('a'): 'z',
    ord('b'): 'y',
    ...
}

Но, к счастью, Pythonтакже есть функция maketrans(), чтобы помочь вам сделать это отображение:

mapping = str.maketrans(string.ascii_lowercase, string.ascii_lowercase[::-1])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...