拼字游戏算法的优化

时间:2018-04-22 10:48:38

标签: python

我正在尝试写一个算法,通过给它一堆字母给你所有可以用字母构造的单词,例如,给定'car'应该返回一个包含[arc,car ,等等...]并且从中返回最好的拼字游戏单词。问题在于找到包含所有单词的列表。 我有一个巨大的txt文件字典,行分隔,我到目前为止尝试过这个:

def find_optimal(bunch_of_letters: str):
words_to_check = []
c1 = Counter(bunch_of_letters.lower())

for word in load_words():
    c2 = Counter(word.lower())
    if c2 & c1 == c2:
        words_to_check.append(word)

max_word = max_word_value(words_to_check)
return max_word,calc_word_value(max_word)

max_word_value - 返回具有给定列表的最大值的单词

calc_word_value - 以拼字游戏的形式返回单词的分数。

load_words - 返回字典列表。

我目前正在使用计数器来做这个技巧,但问题是我目前每次搜索大约需要2.5秒,我不知道如何优化这个,有什么想法吗?

2 个答案:

答案 0 :(得分:0)

试试这个:

def find_optimal(bunch_of_letters):

    bunch_of_letters = ''.join(sorted(bunch_of_letters))

    words_to_check = [word for word in load_words() if ''.join(sorted(word)) in bunch_of_letters]

    max_word = max_word_value(words_to_check)

    return max_word, calc_word_value(max_word)

我刚刚使用(或至少尝试使用)list理解。基本上,words_to_check将(希望!)成为文本文件中所有单词的list

另外,如果您不想使用巨大的文字文件,请查看enchant

答案 1 :(得分:0)

from itertools import permutations

theword = 'car' # or we can use input('Type in a word: ')

mylist = [permutations(theword, i)for i in range(1, len(theword)+1)]


for generator in mylist:
    for word in generator:
        print(''.join(word)) 
    # instead of .join just print (word) for tuple

输出:

  

C

     

a

     

[R

     

CA

     

CR

     

...   ar rc ra car cra acr arc rca rac

这将为我们提供单词的所有可能组合(即排列)。 如果您想查看生成的单词是否是英语词典中的实际单词,我们可以使用This Answer

import enchant
d = enchant.Dict("en_US")
for word in mylist:
    print(d.check(word), word)

结论:

如果想要生成单词的所有组合。我们使用此代码:

from itertools import combinations, permutations, product

word = 'word' # or we can use input('Type in a word: ')

solution = permutations(word, 4)

for i in solution:
    print(''.join(i)) # just print(i) if you want a tuple