0

我正在编写一个小函数来检查输入的字符串是否是莫尔斯电码。该函数应该只在 Inputted_string 中执行“If”或“.”之类的操作:“但我似乎找不到在 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")

粘贴时格式略有偏差,但这是一般要点。当它检查消息是“----”还是“..”等时,这是因为一些莫尔斯电码字母只是那些字符,但我相信有一个更简单的方法来解决这个问题!

4

6 回答 6

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

但是因为消息包含所有字符并不意味着它是有效的。您需要检查每个是否有效,您可以使用 dict 将字母映射到莫尔斯,您还需要有一些明确的格式,即字母之间的空格和单词之间的 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()]))

我选择额外的空格来分隔单词,您可以选择您喜欢的任何内容,只需确保将字符添加到 dict 映射,然后添加到空格或您想要分隔单词的任何内容。

于 2015-09-23T21:15:32.980 回答
3

您可以使用any()

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

bool(message)位还拒绝零长度消息。

于 2015-09-23T21:07:03.480 回答
3

检查 的每个元素message是否在正确的字母表中:

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

或将消息简化为一组:

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

或使用正则表达式:

if re.match('[-.]*$', message):
于 2015-09-23T21:07:10.067 回答
0

只需使用一个简单的正则表达式 -

import re

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

这也可能比遍历消息中的每个字符更快。

于 2015-09-23T21:06:24.957 回答
0

我想大多数 Pythonic 会在这里使用列表推导。这将检查字符串是否完全由 - 和 组成。人物:

s = '---...---'
ismorse = all(c in ('-','.') for c in s)
于 2015-09-23T21:07:12.230 回答
0

这能满足您的需求吗?

for char in message:
    if char not in '.-':
        return False
return True
于 2015-09-23T21:07:52.750 回答