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と一緒に使用し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

辞書を使用します。各文字に dict-key を割り当て、その値としてそれぞれのモールス符号を持たせます。

例 - 各文字にモールス符号を割り当てます。

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

手紙のモールス符号を思い出してください。

morse_for_a = morse["a"]

dict-lookup の時間は、辞書の長さ/サイズの影響を受けません - O(1) です。この回答を参照してください。

于 2012-12-06T23:05:29.050 に答える
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')

基本的に、2つのもの(この場合はアルファベット文字からモールス信号)の間に1対1のマッピングがある場合は常に、辞書を使用します。

于 2012-12-06T23:15:30.983 に答える
1

私がすることは、文字をキーとして使用し、モールス符号を値として使用して辞書を作成することです。次に、変換している文字列を単純にループして、正しい値をすぐに割り当てることができます。

于 2012-12-06T23:05:42.933 に答える
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 に答える
0

デフォルトでa を使用できます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)
'...---...'
于 2012-12-06T23:07:32.883 に答える
0

「手で」行うことはできるだけ少なくします。dict でコードを検索する方が、for ループを「手動で」使用するよりもはるかに高速です。また、すでに小文字であることがわかっているにもかかわらず、アルファベット文字に対して lower() を呼び出しています。文字列全体で 1 回呼び出しますが、確かに良いことです。すべての文字に対して 1 回呼び出すと、正当な理由がなくても遅くなります。

于 2012-12-06T23:09:23.307 に答える