1

我有以下代码,它将输入字符串转换为莫尔斯电码。我的代码遍历字符串中的每个字母,然后遍历字母表中的每个字符。这是非常低效的,因为如果我从一个非常大的文件而不是一个小的字母字符串中读取会怎样。有什么方法可以改进我的代码,也许使用模块 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
4

7 回答 7

6

您可以string.ascii_lowercase与 with 一起使用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')
['...', '-', '.-', '-.-.', '-.-', '---', '...-', '.', '.-.', '..-.', '.-..', '---', '.--']
于 2012-12-06T23:09:18.257 回答
2

使用字典。为每个字母分配一个字典键,然后让它具有相应的摩尔斯电码作为其值。

示例 - 为每个字母分配莫尔斯电码:

morse = {}
morse["a"] = ".-"
morse["b"] = "-..."
#...

回想一下字母的摩尔斯电码:

morse_for_a = morse["a"]

字典查找的时间不受字典长度/大小的影响 - 它是 O(1)。看到这个答案

于 2012-12-06T23:05:29.050 回答
1

我要做的是使用字母作为键和等效的莫尔斯电码作为值创建一个字典。然后您可以简单地遍历您正在转换的字符串并立即分配正确的值。

于 2012-12-06T23:05:42.933 回答
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')

基本上,只要在两件事之间存在一对一的映射(在这种情况下,字母字符到摩尔斯电码),您就会使用字典。

于 2012-12-06T23:15:30.983 回答
0

您可以使用dict带有默认值的 a - 所以如果一个字符存在,则返回它 - 否则它返回原始字符......

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)
'...---...'
于 2012-12-06T23:07:32.883 回答
0

尽可能少地“手工”。在 dict 中查找代码比“手动”使用 for 循环要快得多。此外,您正在为 alfabet 字母调用 lower(),即使您知道它们已经是小写字母。确保在整个字符串上调用一次,这很好。没有充分理由,为每个字母调用一次速度很慢。

于 2012-12-06T23:09:23.307 回答
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!!!")

这将返回:

.... . .-.. .--.
于 2012-12-06T23:13:49.613 回答