如果字符串仅包含“-”或“.”
If String ONLY contains "-" or "."
我正在编写一个小函数来检查输入的字符串是否为摩尔斯电码。
该功能应该做类似的事情
"If "-" 或 "." 仅在 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")
粘贴时格式略有偏差,但这是一般要点。
当它检查消息是否为“----”或“..”等时,这是因为一些莫尔斯电码字母只是这些字符,但我相信有更简单的方法可以解决这个问题!
只需使用一个简单的正则表达式即可-
import re
def is_morse(message):
return True if bool(re.match(r'^[.-]+$', message)) else False
这也可能比遍历消息中的每个字符更快。
您可以使用 any()
:
def is_morse(message):
return bool(message) and not any(ch not in '.- ' for ch in message)
bool(message)
位也拒绝零长度消息。
检查 message
的每个元素是否在正确的字母表中:
if all(c in ['-', '.'] for c in message):
或将消息缩减为一组:
if set(message) <= set(['.', '-'])
或使用正则表达式:
if re.match('[-.]*$', message):
我想大多数 Pythonic 会在这里使用列表理解。这将检查一个字符串是否完全由 - 和 组成。字符:
s = '---...---'
ismorse = all(c in ('-','.') for c in s)
这能满足您的需求吗?
for char in message:
if char not in '.-':
return False
return True
def is_morse(message):
allowed = {".", "-", " "}
return allowed.issuperset(message)
但是因为消息具有所有字符并不意味着它是有效的。您需要检查每个是否有效,您可以使用字典将字母映射到莫尔斯,您还需要有一些明确的格式,即字母之间的 space 和 2 个或更多 spaces单词之间:
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()]))
我选择了额外的 spaces 来分隔单词,你可以选择任何你喜欢的,只要确保将字符添加到 dict 映射中,然后添加到 space 或任何你想要的单词由.
分隔
我正在编写一个小函数来检查输入的字符串是否为摩尔斯电码。 该功能应该做类似的事情 "If "-" 或 "." 仅在 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")
粘贴时格式略有偏差,但这是一般要点。 当它检查消息是否为“----”或“..”等时,这是因为一些莫尔斯电码字母只是这些字符,但我相信有更简单的方法可以解决这个问题!
只需使用一个简单的正则表达式即可-
import re
def is_morse(message):
return True if bool(re.match(r'^[.-]+$', message)) else False
这也可能比遍历消息中的每个字符更快。
您可以使用 any()
:
def is_morse(message):
return bool(message) and not any(ch not in '.- ' for ch in message)
bool(message)
位也拒绝零长度消息。
检查 message
的每个元素是否在正确的字母表中:
if all(c in ['-', '.'] for c in message):
或将消息缩减为一组:
if set(message) <= set(['.', '-'])
或使用正则表达式:
if re.match('[-.]*$', message):
我想大多数 Pythonic 会在这里使用列表理解。这将检查一个字符串是否完全由 - 和 组成。字符:
s = '---...---'
ismorse = all(c in ('-','.') for c in s)
这能满足您的需求吗?
for char in message:
if char not in '.-':
return False
return True
def is_morse(message):
allowed = {".", "-", " "}
return allowed.issuperset(message)
但是因为消息具有所有字符并不意味着它是有效的。您需要检查每个是否有效,您可以使用字典将字母映射到莫尔斯,您还需要有一些明确的格式,即字母之间的 space 和 2 个或更多 spaces单词之间:
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()]))
我选择了额外的 spaces 来分隔单词,你可以选择任何你喜欢的,只要确保将字符添加到 dict 映射中,然后添加到 space 或任何你想要的单词由.
分隔