Python Vigenère Cipher - зашифровать слово

Я хочу создать программу для шифрования целого слова с помощью шифра Виженера. До сих пор я могу зашифровать только одну букву за раз.

Мой код до сих пор:

def alpha(shift):
    initial_letter = 97 + shift 
    alpha_list_shift = (list(map(chr, range(initial_letter, 123))))
    alpha_list_rest = (list(map(chr, range(97, initial_letter))))
    return alpha_list_shift + alpha_list_rest

def encrypt(char_str, char_key):
    column_line_alpha = alpha(0)
    index_char_key = column_line_alpha.index(char_key)
    index_char_str = column_line_alpha.index(char_str)
    column_line_alpha_2 = alpha(index_char_key)
    return column_line_alpha_2[index_char_str]

Является ли вопрос примерно таким: «Как я могу вызвать encrypt() для каждого символа в строке и сохранить результат в другой строке?»

Jim J 09.12.2020 20:11

Да, точно! Извините за мой плохой английский

Geo 09.12.2020 20:12

Без проблем! Я просто хотел убедиться, прежде чем отвечать на неправильный вопрос :)

Jim J 09.12.2020 20:13

@toRex Да! Но, если хотите, каждый отзыв может помочь мне стать лучше. Разные взгляды :)

Geo 09.12.2020 20:35
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
4
63
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Краткий ответ: encrypted_string = "".join([encrypt(chr, key) for chr in string_you_want_to_encrypt])

Более длинный ответ: у Python есть много прекрасных (для меня) способов элегантной работы со списками, и, поскольку строки утыкаются в списки, вы можете использовать синтаксис «понимания списка» для динамического создания нового списка из вашей строки, затем преобразуйте его обратно в строку, используя собственный метод "join" типа String, который объединит все элементы в итерируемом объекте (например, в списке), склеив их вместе с рассматриваемой строкой. Итак, "".join(['x', '2', '#']) вернет строку "x2#". Понимание списка позволяет вам вызывать метод для каждого элемента по мере его итерации, поэтому мы можем вызывать вашу функцию для каждого элемента, и результат будет в списке, возвращенном пониманием списка, а затем сшит обратно в строку с помощью join().

Лучший ответ: может быть веская причина, по которой encrypt принимает по одному символу за раз, но тогда каждый раз, когда вы его вызываете, вам приходится обрабатывать цикл, и это может сделать ваш код немного чище/менее повторяющимся, если вы перепишете encrypt, чтобы взять целая струна. Затем вы можете поместить цикл внутри своего метода примерно так:

encrypted_string = ""
for letter in input_string:
   # [your encryption code]
   encrypted_string += newly_encrypted_character

Как правило, в Python вам не нужно делать что-то похожее на C, где вы создаете цикл, который использует целые числа для отслеживания вашей позиции в строке (или любой другой итерации, такой как кортеж или список). «for <item> in <iterable>» должен сделать всю работу за вас.

расширил краткий ответ :)

Jim J 09.12.2020 20:28

Спасибо! Это помогло! :)

Geo 09.12.2020 20:36

Другие вопросы по теме