Для перевода текста на азбуку, просто map
символы строки в соответствующее значение из словаря translation
:
>>> msg = "HELLO WORLD"
>>> morse = ' '.join(map(translation.get, msg))
>>> morse
'.... . .-.. .-.. --- .-- --- .-. .-.. -..'
Обратите внимание, что я разделил коды пробелами, в противном случае будет практически невозможно декодировать сообщение обратно, поскольку некоторые последовательности могут давать различные комбинации символов. Для обратного перевода сначала нужно перевернуть словарь; затем split
сообщение Морзе через пробел и получить значение из обратного словаря.
>>> trans_back = {v: k for k, v in translation.items()}
>>> ''.join(map(trans_back.get, morse.split()))
'HELLOWORLD'
Обратите внимание, что это убрало пробел, хотя. Чтобы исправить это, вы можете использовать символ, отличный от пробела, для разделения последовательностей кода Морзе.
Или используйте эту немного более сложную версию, используя re.split
, чтобы разделить пробел, только если за этим пробелом не следует или не предшествует другой пробел:
>>> ''.join(map(trans_back.get, re.split("(?<! ) | (?! )", morse)))
'HELLO WORLD'
Чтобы решить, какой способ перевода, т. Е. Является ли исходный текст азбукой или простым текстом, вы можете просто проверить, находятся ли первые или все символы строки в словаре translation
или они допустимы символы Морзе:
if all(c in translation for c in msg):
# translate to morse
elif all(c in ".- " for c in msg):
# translate back
else:
# don't know what to do
Примечание: Этот ответ был опубликован до того, как завершающие пробелы были добавлены ко всем записям в dict.