簡體   English   中英

如何提高循環效率?

[英]How to improve efficiency in loops?

我有以下代碼,它將輸入字符串轉換為莫爾斯電碼。 我的代碼遍歷字符串中的每個字母,然后遍歷字母表中的每個字符。 這是非常低效的,因為如果我從一個很大的文件而不是一個小的字母字符串中讀取該怎么辦。 有什么方法可以改善我的代碼(也許使用模塊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

您可以結合使用string.ascii_lowercasezip()來制作字典:

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')
['...', '-', '.-', '-.-.', '-.-', '---', '...-', '.', '.-.', '..-.', '.-..', '---', '.--']

使用字典 為每個字母分配一個字典鍵,然后將其各自的摩爾斯電碼作為其值。

示例-為每個字母分配莫爾斯電碼:

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

回憶字母的莫爾斯電碼:

morse_for_a = morse["a"]

字典查找的時間不受字典的長度/大小的影響-它是O(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')

基本上,只要您在兩件事之間具有一對一的映射關系(在這種情況下,是字母字符到莫爾斯電碼),便會使用字典。

您可以使用默認值的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)
'...---...'

盡量“手工”少做。 在字典中查找代碼比“手動”使用for循環要快得多。 另外,即使您知道alfabet字母已經是小寫字母,您也要為其調用lower()。 可以肯定的是,在整個字符串上調用一次是很好的。 沒有充分的理由,每個字母都調用一次很慢。

這是一種使用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!!!")

返回:

.... . .-.. .--.

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM