2016-10-30 7 views
0

Я хочу декодировать целые предложения из кода Морзе в нормальный алфавит - мой скрипт делает именно это, но он объединяет все слова - он не сохраняет пробелы. В morseCode (ввод) три пробела представляют собой разделение между словами, в то время как одно пространство представляет собой разделение между буквами.Простые символы как ключ и значение в словаре

Я попытался добавить три пробела в качестве ключа к словарю с соответствующим значением одного пробела, но он, похоже, не работает.

def decodeMorse(morseCode): 
    MORSE_CODE[' '] = ' ' 
    return ''.join(MORSE_CODE.get(i) for i in morseCode.split()) 

Я также попытался отделить ввод, используя регулярные выражения, но мне не удалось. Есть ли способ заставить его работать с использованием словарей? Можно ли использовать пробелы как ключи и входы в словарях?

ответ

1

str.split() разделяет входную строку на пробелы произвольной ширины. Это означает, что вы получаете только те разделы строки, которые являются , а не whitespace (где пробелы включают пробелы).

Обычно вы разделяете входной сигнал дважды; один раз на строке ' ', чтобы получить список слов, то каждое слово на пробел, чтобы получить только буквы:

def decodeMorse(morseCode): 
    return ' '.join([ 
     ''.join([MORSE_CODE.get(i) for i in word.split()]) 
     for word in morseCode.split(' ')]) 

Если вы хотите использовать ваш подход вы должны использовать регулярное выражение для разделения и включают 3-космические сепараторы:

re.split(r'([ ]{3}|)', morseCode) 

, но тогда вам придется отфильтровать одинарное письмо сепараторы, так как re.split() может либо включать или не включать в себя сепаратор для операции разделенного целого, а не для отдельного сепаратора маркеры.

+0

Спасибо, я понимаю - теперь это кажется очевидным. Вы знаете, можете ли вы использовать пробелы в качестве ключа и/или значения в словаре? Я не мог найти никакой информации. – 10001000101111

+0

Конечно, вы можете; это просто строка. В словаре не волнует, что такое * в * строке. –

0

Функция split будет рассматривать трехмерные пробелы как единый разделитель. Таким образом, один из вариантов состоит в том, чтобы сначала разделить сначала на тройное пространство, как предлагает @Martijn Pieters, или сначала заменить тройное пространство чем-то другим, которое не встречается в коде Морзе (например, возможно, |), а затем перевести это как пробел:

def decodeMorse(morseCode): 
    MORSE_CODE['|'] = ' ' 
    return ''.join(MORSE_CODE.get(i) for i in morseCode.replace(' ', '|').split())