Обработка строк Python — замена функции для создания шифра Цезаря

#python

#python

Вопрос:

Я столкнулся с проблемой с моим кодом, я подозреваю, что это мое использование метода replace, но я не уверен. Я хочу написать код, который будет шифровать строку, на которую ссылается переменный открытый текст, используя шифр caesar со сдвигом на 1, а затем сохранить результат в переменной ciphertext; сохранение его там, где мое значение неверно.

 plaintext = 'thequickbrownfoxjumpsoverthelazydog'
alphabet = 'abcdefghijklmnopqrstuvwxyz'
ciphertext = 'thequickbrownfoxjumpsoverthelazydog'

for i in range(len(plaintext)):
    j = plaintext[i]
    j_index = alphabet.index(j)
    if j_index   13 >= 26:
        j_index = (j_index   13) % 26
    else:
        j_index =13
    ciphertext = ciphertext.replace(j,alphabet[j_index])
    print(ciphertext[i])
    
print(ciphertext)
  

Когда я печатаю каждый отдельный символ, он дает мне желаемые результаты, но когда я печатаю зашифрованный текст в целом, некоторые буквы отличаются, а значение неверно. Спасибо за помощь, ТИА.

Я хочу, чтобы мой вывод был: ‘gurdhvpxoebjasbkwhzcfbiregurynmlqbt’, вместо этого я получаю ‘turquickbrbwnfbkwumcfbirrturlnmlqbt’

Отредактировано, чтобы исправить код и добавить вывод.

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

1. пожалуйста, введите ожидаемый результат

2. j = plaintext[i] вы ссылаетесь plaintext , даже если вы никогда не определяли его, я предполагаю, что это опечатка?

3. Представьте, что ваш обычный текст — это «a». Сначала у вас есть i = 0 и измените «a» на «n». Тогда мы i = 13, вы измените «n» обратно на «a». Ваша ошибка заключается в том, что вы не различаете символы, которые уже были закодированы, и те, которые еще не были закодированы. Вы получите неправильный ответ для каждой буквы между a и m.

Ответ №1:

Проблема в том, что символы заменяются более одного раза, потому что мы заменяем всю строку не в точном месте

 plaintext = 'thequickbrownfoxjumpsoverthelazydog'
alphabet = 'abcdefghijklmnopqrstuvwxyz'
ciphertext = 'thequickbrownfoxjumpsoverthelazydog'
ciphertextfinal = ''
for i in range(len(plaintext)):
    j = plaintext[i]
    j_index = alphabet.index(j)
    if j_index   13 >= 26:
        j_index = (j_index   13) % 26
    else:
        j_index =13
    ciphertext = ciphertext.replace(j,alphabet[j_index])
    ciphertextfinal  = ciphertext[i]
    print(ciphertext[i])
    
print(ciphertextfinal)
#prints gurdhvpxoebjasbkwhzcfbiregurynmlqbt
  

Я просто использовал замененную позицию и создал из нее строку, объединив ее в переменную

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

1. Большое вам спасибо! Теперь работает отлично. Для дополнительного пояснения я думал, что мой код просматривает индивидуальное расположение каждой буквы в открытом тексте, а цикл for перебирает эти отдельные символы. Не могли бы вы подробнее объяснить, почему он заменял их более одного раза?

2. ваша строка — abcdef, после цикла 1 новая строка: cbcdef (от a до c), после цикла 2: cdcdef (от b до d), после цикла 3: ededef (от c до e), после цикла 4: efefef (от d до f) и так далее

3. итак, вы видите, что если вы измените ту же строку, это также заменит старые значения, которые хороши, но неверны.