2015-09-23 7 views
-1

Я пишу небольшую функцию, которая проверяет, является ли введенная строка морзевым кодом. Функция должна делать что-то вроде «If» - «or». »Only in Inputted_string:« Но я не могу найти способ сделать единственный бит на Python3. Текущий путь я это реализовано это очень неаккуратно и не очень PythonicЕсли строка содержит ТОЛЬКО "-" или "."

if "-" in message: 
    # message might be morse code so check even more 
     if "." in message: 
      # Message IS morse code so return true 
      return True 
     else: 
      # TODO you can use a REGEX for the below things 
      if '--' in message: 
       # if the messsage contains only hyphens, then check to see if 
       # message contans hyphen only morse code by checking all hyphen 
       # only morse code against message 
       return True 
      elif '-----' in message: 
       # if message contains 0 in morse code, return True 
       return True 
    if "." in message: 
     # message might contain morse code 
     if "-" in message: 
      # message IS morse code. 
      return True 
     else: 
      # check to see if message is dots only morse code 
      # TODO you can use a REGEX for the below things 
      if ".." in message: 
       # message IS Morse Code 
       return True 
      elif "..." in message: 
       # message IS Morse Code 
       return True 
      elif "....": 
      # message IS Morse Code 
       return True 
     # if dots or dash not in message, return none 
     return("Message has no hyphens or full stops") 

форматирование немного выключен, когда я вставил, но это общая суть. Когда он проверяет, есть ли сообщение «----» или «..» и т. Д., Это связано с тем, что некоторые буквы кода Морзе - это только те харектеры, но я уверен, что есть намного более простой способ обойти это!

+5

'return all (char in {'.', '-', ''} для сообщения char в сообщении)'? – jonrsharpe

+0

@jonrsharpe - почему список, а не строка? 'all (char in '.-' для char в сообщении)' –

+1

@ Robᵩ это не список, это набор, поэтому lookup - это 'O (1)' вместо 'O (n)' – jonrsharpe

ответ

8
def is_morse(message): 
    allowed = {".", "-", " "} 
    return allowed.issuperset(message) 

Но поскольку сообщение имеет все символы, не означает, что она действует. Вы должны были бы проверить, если каждый действует, которые вы можете сделать, используя отображение ДИКТ письмо Морса, вы также должны иметь некоторый формат, который является однозначным т.е. пространства между буквами и 2 или более пробелами между словами:

morse = {'---': 'O', '--.': 'G', '-...': 'B', '-..-': 'X', '.-.': 'R', '--.-': 'Q', 
     '--..': 'Z', '.--': 'W', '..---': '2', '.-': 'A', '..': 'I', '-.-.': 'C', 
     '..-.': 'F', '-.--': 'Y', '-': 'T', '.': 'E', '.-..': 'L', '...': 'S', 
     '..-': 'U', '.----': '1', '-----': '0', '-.-': 'K', '-..': 'D', '----.': 
      '9', '-....': '6', '.---': 'J', '.--.': 'P', '....-': '4', '--': 'M', 
     '-.': 'N', '....': 'H', '---..': '8', '...-': 'V', '--...': '7', '.....': 
     '5', '...--': '3',"":" "} 


msg = ".... . .-.. .-.. ----- .-- --- .-. .-.. -.." 

def is_morse(message): 
    spl = message.split(" ") 
    return all(m in morse for m in spl) 

if is_morse(msg): 
    print("".join([morse[ch] for ch in msg.split(" ")])) 

Можно разобрать его как одну строку, получая все вариации, это займет гораздо больше работы.

Если вы хотите пойти в другую сторону, то вы просто поменять местами отображения:

to_morse = {v: k for k, v in morse.items()} 

def can_morse(msg): 
    return all(ch in to_morse for ch in msg.upper()) 


msg = "Hello World" 
if can_morse(msg): 
    print(" ".join([to_morse[ch] for ch in msg.upper()])) 

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

+0

Почему символ пробега включен? – jfs

+0

@ J.F.Sebastian, если OP планирует по-разному разглядывать его на английском, тогда пробелы необходимы –

+0

почему * только * пробел тогда? Если вы хотите объединить токенизацию ввода в буквы и проверку отдельных букв, то должно быть разрешено, по меньшей мере, стандартное пространство, то есть 'letters = message.split()' и 'is_morse = all (map (morse .__ contains__, letters))' – jfs

0

Просто используйте простое регулярное выражение -

import re 

def is_morse(message): 
    return True if bool(re.match(r'^[.-]+$', message)) else False 

Это было бы, вероятно, быстрее тоже, чем итерация по каждому символу в сообщении.

+0

Как насчет пробела? – Wolf

+0

Я не думаю, что символ пробела разрешен. – hspandher

+0

Возможно, это так. Тогда, вероятно, было бы лучше назвать funnction после него, например 'is_morse_letter' или' is_morse_symbol' ... – Wolf

3

Вы можете использовать any():

def is_morse(message): 
    return bool(message) and not any(ch not in '.- ' for ch in message) 

bool(message) бит также отклоняет сообщения нулевой длины.

+0

FYI: решение на основе 'all()' было бы гораздо более читаемым, чем мое решение. Я просто не мог вспомнить, как записать 'all()' :) –

+0

, но все сообщения с нулевой длиной - это код Морзе. – jcoffland

3

Проверьте, если каждый элемент message находится в надлежащем алфавите:

if all(c in ['-', '.'] for c in message): 

или уменьшить сообщение для набора:

if set(message) <= set(['.', '-']) 

или использовать регулярное выражение:

if re.match('[-.]*$', message): 
+0

Вам понадобится якорь '^' в начале регулярного выражения. – Barmar

+1

'match' применяет регулярное выражение к началу строки; 'search' потребует'^'. – chepner

+0

Вы можете использовать '' -. ''Вместо' [' - ','. '] '. – TigerhawkT3

0

Я думаю, что большинство Pythonic будет использовать здесь понимание списка. Это проверяет, содержит ли строка чистое из - и. символов:

s = '---...---' 
ismorse = all(c in ('-','.') for c in s) 
+3

Это генератор, переданный как аргумент 'all', а не понимание списка. – chepner

0

Будет ли это соответствовать вашим потребностям?

for char in message: 
    if char not in '.-': 
     return False 
return True 
+1

Это всего лишь повторная реализация 'all'. – chepner