我正在尝试写一个算法,通过给它一堆字母给你所有可以用字母构造的单词,例如,给定'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秒,我不知道如何优化这个,有什么想法吗?
答案 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