摩尔斯电码转英语 python3
morse code to english python3
我想使用 Python 将摩尔斯电码转换为英语 3+
我已经设法使用这个将英语转换为莫尔斯电码
http://code.activestate.com/recipes/578407-simple-morse-code-translator-in-python/
但我想将摩尔斯电码转换成英语
我曾尝试一次一个字符,但问题是莫尔斯电码字母不像英文字母那样长 1 个字符,所以 E 是“.”。 S 是“...”,我遇到的问题是字典循环会找到“。”并将其与 E 匹配,所以我得到的不是 S,而是 "E E E"
我试图通过检测空格并一次做一个单词来解决这个问题,但它不是在单词中查找字母,而是在字典中搜索整个单词
我是 Python 和字典的新手,我不知道如何区分 E "."在搜索我的字典时出现 S“...”
这是我的代码
# defines the dictionary to convert morse to english
CODE_reversed = {'..-.': 'F', '-..-': 'X',
'.--.': 'P', '-': 'T', '..---': '2',
'....-': '4', '-----': '0', '--...': '7',
'...-': 'V', '-.-.': 'C', '.': 'E', '.---': 'J',
'---': 'O', '-.-': 'K', '----.': '9', '..': 'I',
'.-..': 'L', '.....': '5', '...--': '3', '-.--': 'Y',
'-....': '6', '.--': 'W', '....': 'H', '-.': 'N', '.-.': 'R',
'-...': 'B', '---..': '8', '--..': 'Z', '-..': 'D', '--.-': 'Q',
'--.': 'G', '--': 'M', '..-': 'U', '.-': 'A', '...': 'S', '.----': '1'}
def main():
#takes user message and makes it upper case
msg = input('MESSAGE: ')
msg = msg.upper()
addtolist = "" # creates blank string
message = [] # creates blank list
for i in msg:
addtolist = addtolist + i # adds every letter in MSG into a string until it finds a space
addtolist.upper() # makes every letter uppercase
if i == " ": # if it detects a space
message.extend(addtolist)
# adds the previously created addtolist to a list, this makes one word
addtolist = "" # clears previous variable
for i in message:
# for every word in the list
str(i) # make it into a string
print(CODE_reversed[i()]) # search the dictionary for that word
if __name__ == "__main__":
main()
此代码接受一个词,并尝试在字典中查找它,但它不起作用
我也试过在字典中搜索每个单独的摩尔斯电码字母,但问题是你无法分辨字母何时开始和结束,所以“...”出现为 "EEE" 而不是 "S" 我不知道如何解决这个问题
我也试过寻找解决方案,但只在 Java 中找到,我不知道 Java
一旦你在一个方向上定义了映射,你就可以使用字典推导来将它映射到另一个方向
CODE = {'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': '--..',
'0': '-----', '1': '.----', '2': '..---',
'3': '...--', '4': '....-', '5': '.....',
'6': '-....', '7': '--...', '8': '---..',
'9': '----.'
}
CODE_REVERSED = {value:key for key,value in CODE.items()}
然后您可以使用 join
和生成器表达式来执行翻译。
def to_morse(s):
return ' '.join(CODE.get(i.upper()) for i in s)
def from_morse(s):
return ''.join(CODE_REVERSED.get(i) for i in s.split())
>>> to_morse('hello')
'.... . .-.. .-.. ---'
>>> from_morse('.... . .-.. .-.. ---')
'HELLO'
mor = {'.-': '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', '-----': '0',
'.----': '1', '..---': '2', '...--': '3',
'....-': '4', '.....': '5', '-....': '6',
'--...': '7', '---..': '8', '----.': '9'}
print('''Enter your msg in Morse.
Notic that:
1- Use / to separate the letters and space to separate words.
2- Your message must contain only letters and numbers.
3- '?' in output means that your input was unknowed.
>>> ''', end = '')
msg = input(' ')
out = []
letter = []
j = -1
for i in msg.split(' '):
j += 1
letter += [i.split('/')]
for k in range(len(letter[j])):
out += mor.get(letter[j][k], '?')
out += ' '
print('\n >>> Your msg is: ', end = '')
print(''.join(out))`
输出:
Enter your msg in Morse.
Notic that:
1- Use / to separate the letters and space to separate words.
2- Your message must contain only letters and numbers.
3- '?' in output means that your input was unknowed.
>>> ...././.-../.-.. .--/---/.-./.-../-.. (for example)
>>> Your msg is: HELLO WORLD
我知道这是一个老问题,但按照开源的传统,我编写了代码来实现摩尔斯是二叉树这一事实,这可能比使用字典更快:
class node:
def __init__(self, char):
self.dot = None
self.dash = None
self.alpha = char
def __str__(self):
return self.alpha
def nextNode(self, basenode, char):
if char == '.' and basenode.dot is None:
basenode.dot = node('*')
return basenode.dot
elif char == '.':
return basenode.dot
elif char == '-' and basenode.dash is None:
basenode.dash = node('*')
return basenode.dash
elif char == '-':
return basenode.dash
else:
return basenode
def traverse(self, basenode, tone):
current = basenode
for char in tone:
current = self.nextNode(current, char)
return current
def insert(self, basenode, key): # @ val = tuple ('P','.--.')
char = self.traverse(basenode, key[1])
char.alpha = key[0]
def decode(self, basenode, tone): #@ tone is a morse string
return self.traverse(basenode, tone).alpha
class morse:
def __init__(self, char):
self.base = node(char)
self.MORSE = {'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': '--..',
'1': '.----', '2': '..---', '3': '...--',
'4': '....-', '5': '.....', '6': '-....',
'7': '--...', '8': '---..', '9': '----.',
'0': '-----', ', ': '--..--', '.': '.-.-.-',
'?': '..--..', '/': '-..-.', '-': '-....-',
'(': '-.--.', ')': '-.--.-', ' ': ' '}
for x in self.MORSE:
self.base.insert(self.base, (x, self.MORSE.get(x)))
def translate(self, tone):
return self.base.decode(self.base, tone)
def __str__(self):
print(self.base)
return
y = morse(' ')
code = ["-.-.", '.-.', '-.--', '.-.-.-', ' ', '--', '.', '.-.-.-', ' ', '.-',
'.-.-.-', ' ', '.-.', '..', '...-', '.', '.-.', '.-.-.-']
line =[]
for char in code:
line.append(y.translate(char))
print(*line)
如果例如字典被预分类为以 'E' 和 'T' 开头的正确顺序,这可能会更有效率,那么我们就不必像我那样构建树。我对 python 还很陌生,所以可能还有其他方法可以做到这一点,但这很有效。我打算增加一个可以听实时代码和翻译的功能。
我想使用 Python 将摩尔斯电码转换为英语 3+ 我已经设法使用这个将英语转换为莫尔斯电码 http://code.activestate.com/recipes/578407-simple-morse-code-translator-in-python/
但我想将摩尔斯电码转换成英语
我曾尝试一次一个字符,但问题是莫尔斯电码字母不像英文字母那样长 1 个字符,所以 E 是“.”。 S 是“...”,我遇到的问题是字典循环会找到“。”并将其与 E 匹配,所以我得到的不是 S,而是 "E E E" 我试图通过检测空格并一次做一个单词来解决这个问题,但它不是在单词中查找字母,而是在字典中搜索整个单词 我是 Python 和字典的新手,我不知道如何区分 E "."在搜索我的字典时出现 S“...”
这是我的代码
# defines the dictionary to convert morse to english
CODE_reversed = {'..-.': 'F', '-..-': 'X',
'.--.': 'P', '-': 'T', '..---': '2',
'....-': '4', '-----': '0', '--...': '7',
'...-': 'V', '-.-.': 'C', '.': 'E', '.---': 'J',
'---': 'O', '-.-': 'K', '----.': '9', '..': 'I',
'.-..': 'L', '.....': '5', '...--': '3', '-.--': 'Y',
'-....': '6', '.--': 'W', '....': 'H', '-.': 'N', '.-.': 'R',
'-...': 'B', '---..': '8', '--..': 'Z', '-..': 'D', '--.-': 'Q',
'--.': 'G', '--': 'M', '..-': 'U', '.-': 'A', '...': 'S', '.----': '1'}
def main():
#takes user message and makes it upper case
msg = input('MESSAGE: ')
msg = msg.upper()
addtolist = "" # creates blank string
message = [] # creates blank list
for i in msg:
addtolist = addtolist + i # adds every letter in MSG into a string until it finds a space
addtolist.upper() # makes every letter uppercase
if i == " ": # if it detects a space
message.extend(addtolist)
# adds the previously created addtolist to a list, this makes one word
addtolist = "" # clears previous variable
for i in message:
# for every word in the list
str(i) # make it into a string
print(CODE_reversed[i()]) # search the dictionary for that word
if __name__ == "__main__":
main()
此代码接受一个词,并尝试在字典中查找它,但它不起作用 我也试过在字典中搜索每个单独的摩尔斯电码字母,但问题是你无法分辨字母何时开始和结束,所以“...”出现为 "EEE" 而不是 "S" 我不知道如何解决这个问题
我也试过寻找解决方案,但只在 Java 中找到,我不知道 Java
一旦你在一个方向上定义了映射,你就可以使用字典推导来将它映射到另一个方向
CODE = {'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': '--..',
'0': '-----', '1': '.----', '2': '..---',
'3': '...--', '4': '....-', '5': '.....',
'6': '-....', '7': '--...', '8': '---..',
'9': '----.'
}
CODE_REVERSED = {value:key for key,value in CODE.items()}
然后您可以使用 join
和生成器表达式来执行翻译。
def to_morse(s):
return ' '.join(CODE.get(i.upper()) for i in s)
def from_morse(s):
return ''.join(CODE_REVERSED.get(i) for i in s.split())
>>> to_morse('hello')
'.... . .-.. .-.. ---'
>>> from_morse('.... . .-.. .-.. ---')
'HELLO'
mor = {'.-': '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', '-----': '0',
'.----': '1', '..---': '2', '...--': '3',
'....-': '4', '.....': '5', '-....': '6',
'--...': '7', '---..': '8', '----.': '9'}
print('''Enter your msg in Morse.
Notic that:
1- Use / to separate the letters and space to separate words.
2- Your message must contain only letters and numbers.
3- '?' in output means that your input was unknowed.
>>> ''', end = '')
msg = input(' ')
out = []
letter = []
j = -1
for i in msg.split(' '):
j += 1
letter += [i.split('/')]
for k in range(len(letter[j])):
out += mor.get(letter[j][k], '?')
out += ' '
print('\n >>> Your msg is: ', end = '')
print(''.join(out))`
输出:
Enter your msg in Morse.
Notic that:
1- Use / to separate the letters and space to separate words.
2- Your message must contain only letters and numbers.
3- '?' in output means that your input was unknowed.
>>> ...././.-../.-.. .--/---/.-./.-../-.. (for example)
>>> Your msg is: HELLO WORLD
我知道这是一个老问题,但按照开源的传统,我编写了代码来实现摩尔斯是二叉树这一事实,这可能比使用字典更快:
class node:
def __init__(self, char):
self.dot = None
self.dash = None
self.alpha = char
def __str__(self):
return self.alpha
def nextNode(self, basenode, char):
if char == '.' and basenode.dot is None:
basenode.dot = node('*')
return basenode.dot
elif char == '.':
return basenode.dot
elif char == '-' and basenode.dash is None:
basenode.dash = node('*')
return basenode.dash
elif char == '-':
return basenode.dash
else:
return basenode
def traverse(self, basenode, tone):
current = basenode
for char in tone:
current = self.nextNode(current, char)
return current
def insert(self, basenode, key): # @ val = tuple ('P','.--.')
char = self.traverse(basenode, key[1])
char.alpha = key[0]
def decode(self, basenode, tone): #@ tone is a morse string
return self.traverse(basenode, tone).alpha
class morse:
def __init__(self, char):
self.base = node(char)
self.MORSE = {'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': '--..',
'1': '.----', '2': '..---', '3': '...--',
'4': '....-', '5': '.....', '6': '-....',
'7': '--...', '8': '---..', '9': '----.',
'0': '-----', ', ': '--..--', '.': '.-.-.-',
'?': '..--..', '/': '-..-.', '-': '-....-',
'(': '-.--.', ')': '-.--.-', ' ': ' '}
for x in self.MORSE:
self.base.insert(self.base, (x, self.MORSE.get(x)))
def translate(self, tone):
return self.base.decode(self.base, tone)
def __str__(self):
print(self.base)
return
y = morse(' ')
code = ["-.-.", '.-.', '-.--', '.-.-.-', ' ', '--', '.', '.-.-.-', ' ', '.-',
'.-.-.-', ' ', '.-.', '..', '...-', '.', '.-.', '.-.-.-']
line =[]
for char in code:
line.append(y.translate(char))
print(*line)
如果例如字典被预分类为以 'E' 和 'T' 开头的正确顺序,这可能会更有效率,那么我们就不必像我那样构建树。我对 python 还很陌生,所以可能还有其他方法可以做到这一点,但这很有效。我打算增加一个可以听实时代码和翻译的功能。