Как сохранить повторяющиеся символы?
В процессе изучения Python поставил себе задачу написания небольшого примитивного шифровальщика, который будет шифровать введенное слово, сопоставляя каждый символ с заданным в словаре значением, или расшифровывать в обратном порядке. В приведенном участке кода описано только мое видение процесса шифрования слова из переменной open_pass.
from collections import OrderedDict
# Использую данное упорядочивание, чтобы при выводе результата сопоставления не терялась последоваительнгость open_pass.
# Читал, что dict умеет запоминать порядок вставки, но пока не смог разобраться.
open_pass = list('Password') # вдальнейшем будет так list(input('Enter open part of password: '))
secure = {'!Q':'a', '_>':'b', ':3':'c', 'N9':'d', '0.':'e', '=}':'f', '@#':'g', '](':'h', 'ay':'i', 'V*':'j',
'$%':'k', '&j':'l', '+-':'m', 'k#':'n', '3,':'o', '[<':'p', '.,':'q', 'aP':'r', 'Bf':'s', 'I;':'t',
'S6':'u', '_':'v', 'C;':'w', 'ns':'x', 'R|':'y', ')o':'z', '&z':'A', '%h':'B', '$)-':'C', 'B;':'D', 'lK':'E',
'lJ':'F', '||':'G', 'ld':'H', '()':'I', '}{':'J', '+=_':'K', '__0':'L', '&^%':'M', '><?':'N', 'hsj':'O',
'|][':'P', 'm<':'Q', 'klH':'R', '(!*':'S', 'mH':'T', 'ad':'U', 'kj':'V', ')as':'W', '/.L':'X', 'zdf':'Y',
']|p':'Z', 'zja':'1', 'okk':'2', '@34':'3', 'l}|':'4', 'xn':'5', 'zsf':'6', '89L':'7', '#4':'8', 'lL':'9',
'Opk':'0'} # словарь в котором приводятся соответствия символов к шифруемым значениям
reversed_dict = {x: y for y, x in secure.items()} #реверс словаря для шифровки
result = OrderedDict()
for a in open_pass:
result[a] = reversed_dict[a]
print(result)
В результате получаю:
OrderedDict([('P', '|]['), ('a', '!Q'), ('s', 'Bf'), ('w', 'C;'), ('o', '3,'), ('r', 'aP'), ('d', 'N9')])
Как видно в результате 's' выводится 1 раз, а в шифруемом пароле идет подряд 2 раза. Вопрос, как сделать, чтобы выводились все символы из шифруемого пароля при условии, что они повторяются? Спасибо большое за уделенное время. Извините за глупые вопросы.
Ответы (1 шт):
Словарь - это всегда словарь. Что просто dict, что OrderedDict - это всё-равно словарь. А в словаре ключ не может повторяться.
Пишите результат в список (список - это упорядоченная структура, где элементы могут повторяться). Не совсем понимаю, что вы хотите на выходе, но вот максимально близко к вашему выводу и со всеми символами:
result = [(a, reversed_dict[a]) for a in open_pass]
print(result)
Вывод:
[('P', '|]['), ('a', '!Q'), ('s', 'Bf'), ('s', 'Bf'), ('w', 'C;'), ('o', '3,'), ('r', 'aP'), ('d', 'N9')]
Просто закодированная строка, без ключей словаря, а также раскодирование:
result = ''.join([reversed_dict[a] for a in open_pass])
print(result)
restore = ""
buff = ""
for ch in result:
buff += ch
if buff in secure:
restore += secure[buff]
buff = ""
print(restore)
Вывод:
|][!QBfBfC;3,aPN9
Password