【问题标题】:morse code to english python3莫尔斯电码到英文python3
【发布时间】:2015-11-12 16:41:25
【问题描述】:

我想使用 Python 3+ 将摩尔斯电码转换为英语 我已经设法使用这个将英语转换为莫尔斯电码 http://code.activestate.com/recipes/578407-simple-morse-code-translator-in-python/

但我想将摩尔斯电码转换为英文

我曾尝试一次只写一个字符,但问题是莫尔斯电码字母不像英文字母那样长 1 个字符,所以 E 是“。” S 是“...”,我遇到的问题是字典循环会找到“。”并将其与 E 匹配,所以我得到“E E E”而不是 S 我试图通过检测空格并一次执行一个单词来解决此问题,但不是在单词中查找字母,而是在字典中搜索整个单词 我是 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

【问题讨论】:

  • 您必须扫描输入,直到您到达指示下一个字符的暂停。例如,如果您输入了". . .",则点之间有一个空格,并且您有三个"."s,但如果输入是"...",您没有空格,所以您有一个"..."。您可以通过在输入上使用split 方法来做到这一点。
  • 电码(Morse)不是单射函数是一个数学问题。您必须知道代码元素之间的空格(中断)。 en.wikipedia.org/wiki/Injective_function

标签: python dictionary morse-code


【解决方案1】:

一旦你定义了一个方向的映射,你就可以使用字典推导来映射它的另一个方向

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'

【讨论】:

  • python 强大的例子
  • 谢谢!我知道有一种更简单的方法可以做到这一点,python 真的很棒!
【解决方案2】:
 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

【讨论】:

    【解决方案3】:

    我知道这是一个老问题,但按照开源的传统,我编写代码来实现 Morse 是二叉树这一事实,这可能比使用字典更快:

    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很陌生,所以可能还有其他方法可以做到这一点,但这很有效。我打算添加一个可以监听实时代码并翻译的功能。

    【讨论】:

      猜你喜欢
      • 2015-09-03
      • 1970-01-01
      • 2014-09-18
      • 1970-01-01
      • 1970-01-01
      • 2021-11-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多