我决定在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
也许你们可以告诉我什么是错的,或者帮助我进行优化。我有空间的麻烦。莫尔斯句子中的三个空格只是单词之间的空格。
答案 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
如您所见,使用此技术可以轻松测试这些类型的算法。请记住,算法应该适用于任何类型的输入,因此不要仅仅提供良好的案例,请使用所有类型的允许输入。有时这种答案更好,而不是直接提供解决方案。希望它有所帮助。