Использование словаря и распечатка значения при совпадении ключа и наоборот - PullRequest
0 голосов
/ 05 мая 2018

У меня есть словарь, где key - это буква в алфавите, а value - соответствующая буква азбуки Морзе (например, ”A”: “.-“). У меня также есть пользовательский ввод, где пользователь помещает туда сообщение. Как только они нажимают ввод, он проверяет каждую вводимую букву, чтобы увидеть, находится ли она в азбуке Морзе или английской букве, проверяя, находится ли она в значении или клавише. После этого я хочу, чтобы он напечатал соответствующее письмо (например, если он обнаружит, что «.-», «A» будет напечатано). Как бы я это сделал?

Вот мой код:

translation = {
"A": ".-",
"B": "-...",
"C": "-.-.",
"D": "-..",
"E": ".",
"F": "..-.",
"G": "--.",
"H": "....",
"I": "..",
"J": ".---",
"K": "-.-",
"L": ".-..",
"M": "--",
"N": "-.",
"O": "---",
"P": ".--.",
"Q": "--.-",
"R": ".-.",
"S": "...",
"T": "-",
"U": "..-",
"V": "...-",
"W": ".--",
"X": "-..-",
"Y": "-.--",
"Z": "--..",
" ": "  "
}

user_input = input("Input english or morse code message:\n").upper()

for i in user_input:
    if i in translation.keys(): 
        print(translation.values()) 
    if i in translation.values():
        print(translation.keys())

Ответы [ 4 ]

0 голосов
/ 05 мая 2018

Для перевода текста на азбуку, просто 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.

0 голосов
/ 05 мая 2018

Создайте обратный индекс исходного dict, и тогда у вас будет два удобных поиска. Теперь у вас есть проблема, что Морзе отличается от длины символов. Предполагая, что межсимвольный интервал Морзе записывается как пробел, вы можете использовать входной поток по одному токену за один раз, сначала проверив, является ли его альфа (pop 1 char) или morse (pop множественные символы).

Обратите внимание, что i in translation не translation.keys()

translation = {... your original dict ...}
morse_to_alpha = {v,k for k,v in translation.items()}

user_input = input("Input english or morse code message:\n").upper()

while user_input:
    if user_input[0] in translation:
        print(translation.pop(0))
    elif user_input[0] in '.-':
        try:
             separator = user_input.index(' ')
        except ValueError:
             separator = len(user_input)
        morse = user_input[:separator]
        del user_input[:separator+1]
        print(morse_to_alpha[morse])
    else:
        print("unkown symbol") 
0 голосов
/ 05 мая 2018

Вы должны будете проверить, является ли это сообщение Морзе или альфа сообщение:

 # build a reversed dict
translation_from_morse = {v: k for k, v in translation.items()}

user_input = input("Input english or morse code message:\n").upper()

if user_input[0] in ".-":
    print(" ".join("".join(translation_from[morse] for morse in part.split(" ")) for part in user_input .split("  ")))
else:
    print(" ".join(translation_to.get(c, c) for c in user_input ))
0 голосов
/ 05 мая 2018

Перевод с буквы на азбуку Морзе в этом случае довольно прост. Вы просто получаете доступ к значению с помощью ключа и соединяете каждое строковое значение с другой строкой. Смотрите ниже:

user_input = input("Input english to translate to morse code: ")

morse_code_message = ""
for i in user_input:
    if i in translation.keys():
         morse_code_message += translation[i]
print(morse_code_message)

Однако словари не предназначены для использования наоборот. Так что азбука на английском будет другой. Вам придется искать значения словаря. Смотрите этот пост , если вам абсолютно необходимо сделать это таким образом. Дешевый и простой способ обойти это - просто создать две таблицы перевода и использовать ту же логику, что и для английского языка Морзе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...