メモリ効率が非常に悪いことを気にしない場合は、単語のセットをハッシュ テーブルに格納できます。キーはパターンです (これは、データを取得するための最速のアルゴリズムの 1 つになるはずです)。
trees = {}
def init(filename):
with open(filename) as f:
for word in f:
word = word.strip()
s = trees.get((len(word),0,''), set())
s.add(word)
trees[(len(word),0,'')] = s
for i,c in enumerate(word):
s = trees.get((len(word),i,c), set())
s.add(word)
trees[(len(word),i,c)] = s
def words_for_pattern(pattern):
pattern = pattern.lower()
words = trees[(len(pattern),0,'')]
for i, c in enumerate(pattern):
if c in "abcddefghijklmnopqrstuvwxyz":
words = words.intersection(trees[(len(pattern),i,c)])
return words
if __name__ == '__main__':
init('english-words.20')
while (True):
pattern = raw_input("Enter pattern: ")
print words_for_pattern(pattern)
Enter pattern: **ll*
>>> set(['balls', 'rolls', 'hills', 'cells', 'polls', 'jelly', 'bills', 'pills', 'jolly', 'halls', 'bells'])
trees
キーが 3 タプルであるマップを次に示します。各(word-length, character index, character)
キーの値は、長さがword-length
およびcharacter
がそのcharacter index
場所にあるすべての単語のセットです。さらに、特定の長さのすべての単語を含む特別なキーがあります。
パターンの単語を取得するとき、パターン内の空白以外の各文字の単語のセットを交差させます。