我有以下代码,它将输入字符串转换为莫尔斯代码。我的代码遍历字符串中的每个字母,然后遍历字母表中的每个字符。这是非常低效的,因为如果我从一个非常大的文件中读取,而不是一个小的字母串。有什么方法可以改进我的代码,也许使用模块re,将我的字符串与莫尔斯代码字符匹配?
morse_alphabet = ".- -... -.-. -.. . ..-. --. .... .. .--- -.- .-.. -- -. --- .--. --.- .-. ... - ..- ...- .-- -..- -.-- --.."
ALPHABET = "abcdefghijklmnopqrstuvwxyz"
morse_letters = morse_alphabet.split(" ")
result = []
count_character = 0
def t(code):
for character in code:
count_letter = 0
for letter in ALPHABET:
lower_character = code[count_character].lower()
lower_letter = letter.lower()
if lower_character == lower_letter:
result.append(morse_letters[count_letter])
count_letter += 1
count_character += 1
return result
答案 0 :(得分:6)
您可以将string.ascii_lowercase
与zip()
一起使用来制作词典:
import string
morse_alphabet = ".- -... -.-. -.. . ..-. --. .... .. .--- -.- .-.. -- -. --- .--. --.- .-. ... - ..- ...- .-- -..- -.-- --.."
morse_letters = dict(zip(string.ascii_lowercase, morse_alphabet.split()))
def t(code):
return filter(None, (morse_letters.get(c.lower()) for c in code))
t
函数减少为filter()
,并且生成器表达式循环输入代码中的每个字符。
morse_letters
字典现在可以非常快速地查找代码,filter()
会删除任何不是字母的None
结果。
结果:
>>> t('S.O.S.')
['...', '---', '...']
>>> t('Stack Overflow')
['...', '-', '.-', '-.-.', '-.-', '---', '...-', '.', '.-.', '..-.', '.-..', '---', '.--']
答案 1 :(得分:2)
使用dictionary。为每个字母分配一个dict-key,然后让它具有相应的莫尔斯码的值。
示例 - 为每个字母分配莫尔斯电码:
morse = {}
morse["a"] = ".-"
morse["b"] = "-..."
#...
回忆一封信的摩尔斯电码:
morse_for_a = morse["a"]
字典查找的时间不受字典长度/大小的影响 - 它是O(1)。请参阅this answer。
答案 2 :(得分:1)
我要做的是使用字母作为键创建字典,使用莫尔斯代码作为值。然后,您可以简单地遍历要转换的String并立即分配正确的值。
答案 3 :(得分:1)
您可以使用字典,如下所示:
morse_alphabet = ".- -... -.-. -.. . ..-. --. .... .. .--- -.- .-.. -- -. --- .--. --.- .-. ... - ..- ...- .-- -..- -.-- --.."
ALPHABET = "abcdefghijklmnopqrstuvwxyz"
morse_letters = morse_alphabet.split(' ')
char_to_morse = dict(zip(ALPHABET, morse_letters))
def t(code):
result = []
for char in code:
result.append(char_to_morse[char.lower()])
return result
print t('abc')
基本上,只要你在两件事之间有一对一的映射(在这种情况下,字母字符与莫尔斯代码),你就会使用字典。
答案 4 :(得分:0)
您可以使用带有默认值的dict
- 所以如果存在某个字符,则返回该字符 - 否则返回原始字符...
morse_alphabet = ".- -... -.-. -.. . ..-. --. .... .. .--- -.- .-.. -- -. --- .--. --.- .-. ... - ..- ...- .-- -..- -.-- --.."
ALPHABET = "abcdefghijklmnopqrstuvwxyz"
lookup = dict(zip(ALPHABET, morse_alphabet.split()))
>>> from pprint import pprint
>>> pprint(lookup)
{'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': '--..'}
s = 'sos'
print ''.join(lookup.get(ch, ch) for ch in s)
'...---...'
答案 5 :(得分:0)
尽可能少地“手工”。查找dict中的代码要比使用for循环“手动”快得多。此外,你正在为alfabet字母调用lower(),即使你知道它们已经是小写的。在整个字符串上调用一次,确实是好的。没有充分理由,每个字母都会调用一次。
答案 6 :(得分:0)
这是使用ascii代码的方法:
morse_alphabet = ".- -... -.-. -.. . ..-. --. .... .. .--- -.- .-.. -- -. --- .--. --.- .-. ... - ..- ...- .-- -..- -.-- --..".split(" ")
CHAR_OFFSET = 97 # ord(a) = 97, i.e. a is 97 in ascii
def string_to_morse_code(string):
morse_code = []
for char in string.lower():
try:
morse_code.append( morse_alphabet[ ord(char) - CHAR_OFFSET] )
except IndexError:
continue # ignore any chars we don't understand
return ' '.join(morse_code)
print string_to_morse_code("Help!!!")
返回:
.... . .-.. .--.