莫尔斯码解码和' NoneType'错误(Python)

时间:2016-12-09 20:31:45

标签: python

我决定在CodeWars上练习Python,所以我有点卡住并请求你帮忙,或者给我一个建议。

一般来说,这是摩尔斯电码解码器,我自己写的,这里的代码是:

def decodeMorse(morseCode):
    letter, decodedMsg = '', ''
    spaceCount = 0

    morseABC = {'.-':'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 let in morseCode: #Gets each symbol from morseCode
            if let != ' ':  #Checks if the sym is not spacebar
                letter += let #Adds sym to letter
                spaceCount += 1
            elif let == " " and spaceCount > 0: #Checks if the sym is spacebar
                decodedMsg += morseABC.get(letter) #Adds the decoded letter
                letter = '' #Flushes letter var
                spaceCount = 0
            else: 
                decodedMsg += ' '

    decodedMsg += morseABC.get(letter) #Writes the last word
    decodedMsg = decodedMsg.replace('  ', ' ') #Replaces 2 spaces to 1
    letter = ''          

    return decodedMsg 

decodeMorse('.... . .-.. .-.. ---   .-- --- .-. .-.. -..') => HELLO WORLD

当我在VS Code中运行它时,它运行良好,但CodeWars解释器说它有

Traceback:    
    in     
    in decodeMorse 
TypeError: cannot concatenate 'str' and 'NoneType' objects

也许你们可以告诉我什么是错的,或者帮助我进行优化。我有空间的麻烦。莫尔斯句子中的三个空格只是单词之间的空格。

3 个答案:

答案 0 :(得分:3)

如果在morseABC.get(letter)

的键中找不到None

letter确实可以返回morseABC

答案 1 :(得分:0)

当末尾有错误的空格时会发生错误。

In [13]: decodeMorse('.... . .-.. .-.. ---  .-- --- .-. .-.. -..')
Out[13]: 'HELLO WORLD'

In [14]: decodeMorse('.... . .-.. .-.. ---  .-- --- .-. .-.. -.. ')
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-14-3ea2da5fb8ec> in <module>()
----> 1 decodeMorse('.... . .-.. .-.. ---  .-- --- .-. .-.. -.. ')

<ipython-input-2-e2d6eb0e5152> in decodeMorse(morseCode)
     23                 decodedMsg += ' '
     24
---> 25     decodedMsg += morseABC.get(letter) #Writes the last word
     26     decodedMsg = decodedMsg.replace('  ', ' ') #Replaces 2 spaces to 1
     27     letter = ''

TypeError: Can't convert 'NoneType' object to str implicitly

In [15]:

因为get返回默认值None

我认为split 单个空格上的字符串可能更好,将空字符串添加到单个空格映射到您的字典,然后使用join

In [18]: message
Out[18]: '.... . .-.. .-.. ---  .-- --- .-. .-.. -.. '

In [19]: morseABC = {'.-':'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', '':' '}

In [20]: tokens = message.split(' ')

In [21]: ''.join(morseABC[token] for token in tokens)
Out[21]: 'HELLO WORLD '

In [22]:

答案 2 :(得分:0)

我不会为你的算法给你一个修复因为你已经接近了,而是这里有一个简单的技术可以帮助你修复你当前的错误版本。诀窍是用随机字符串输入你的算法,直到你能够重现代码大战网站错误:

import random


def decodeMorse(morseCode):
    letter, decodedMsg = '', ''
    spaceCount = 0

    morseABC = {'.-': '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 let in morseCode:  # Gets each symbol from morseCode
        if let != ' ':  # Checks if the sym is not spacebar
            letter += let  # Adds sym to letter
            spaceCount += 1
        elif let == " " and spaceCount > 0:  # Checks if the sym is spacebar
            decodedMsg += morseABC.get(letter)  # Adds the decoded letter
            letter = ''  # Flushes letter var
            spaceCount = 0
        else:
            decodedMsg += ' '

    decodedMsg += morseABC.get(letter)  # Writes the last word
    decodedMsg = decodedMsg.replace('  ', ' ')  # Replaces 2 spaces to 1
    letter = ''

    return decodedMsg

random.seed(1)

for i in range(10):
    print('-' * 80)
    test = ''.join(random.choice(['.', '-', ' ']) for _ in range(20))
    print(test)
    try:
        print(decodeMorse(test))
    except Exception as e:
        print(e)

输出将是:

--------------------------------------------------------------------------------
. .-.--- -..-.-- . -
Can't convert 'NoneType' object to str implicitly
--------------------------------------------------------------------------------
- . .-...  .- .- . .
Can't convert 'NoneType' object to str implicitly
--------------------------------------------------------------------------------
-- .-. .--.-  ..  -.
Can't convert 'NoneType' object to str implicitly
--------------------------------------------------------------------------------
 -   -  .-- - - .-. 
Can't convert 'NoneType' object to str implicitly
--------------------------------------------------------------------------------
-- .-    -.-  .. ---
MA  K IO
--------------------------------------------------------------------------------
 .-.-    - .. ...  .
Can't convert 'NoneType' object to str implicitly
--------------------------------------------------------------------------------
- - ---    .-  .  .-
TTO  A E A
--------------------------------------------------------------------------------
.--  . -----.    -- 
Can't convert 'NoneType' object to str implicitly
--------------------------------------------------------------------------------
.. .  .. -. ...-.-.-
Can't convert 'NoneType' object to str implicitly
--------------------------------------------------------------------------------
. .--...- . -  -- --
Can't convert 'NoneType' object to str implicitly

如您所见,使用此技术可以轻松测试这些类型的算法。请记住,算法应该适用于任何类型的输入,因此不要仅仅提供良好的案例,请使用所有类型的允许输入。有时这种答案更好,而不是直接提供解决方案。希望它有所帮助。