我正在尝试向函数中输入随机字母集,以便它从文本文件中返回所有可能的单词,这些文本可以由这些随机字母组成,长度在4到9个字符之间。目前,代码返回的单词仅由集合中的字母组成,但在某些情况下,它将多次使用一个元素来生成单词。我希望它仅输出使用每个字母一次的单词。例如,将返回“动物”,但它使用了两次字母“ a”来制作单词。
letterList = ["a", "n", "i", "b", "s", "l", "s", "y", "m"]
with open('american-english') as f:
for w in f:
w = w.strip()
cond = all(i in letterList for i in w) and letterList[4] in w
if 9 > len(w) >= 4 and cond:
print(w)
答案 0 :(得分:0)
一个简单的选择可能是使用您现有的方法比较每个字母的计数。
您还可以尝试使用itertools.permutations从字母中生成所有可能的“单词”,并检查每个单词是否在词典中。我怀疑这会很慢,因为排列的数量会很大,而且大多数都不是文字。
查找字谜的常用技术是按字母顺序对两个单词的字母进行排序,然后进行相等性比较:
sorted(word1)==sorted(word2)
如果这是True,则word1和word2为字谜。您可以使用它来减少比较次数,因为使用此技术,您只需要排序后唯一的排列即可。
我编写了一个脚本来显示所有这三个方法,并允许您对其进行基准测试。我的测试表明,随着信件列表的增加,未改进的itertools方法的伸缩性非常差。计数方法一般,但改进的itertools方法通常最快。当然,这些都可以进一步优化。和他们一起去吧。
import time
import itertools
letterList = list('catd')
#letter counting method
tic=time.time()
with open(r'D:/words_alpha.txt','r') as f:
for word in f:
if all([word.strip().count(letter) <= letterList.count(letter) for letter in word]):
print(word.strip())
toc=time.time()
print(toc-tic)
#permutations with no refinement
tic=time.time()
with open(r'D:/words_alpha.txt','r') as f:
for word in f:
for n in range(1,len(letterList)+1):
for pseudoword in itertools.permutations(letterList,n):
if word.strip() == "".join(pseudoword):
print(word.strip())
toc=time.time()
print(toc-tic)
#permutations with anagram refinement
tic=time.time()
pwords=[]
for n in range(1, len(letterList) + 1):
for pseudoword in itertools.permutations(letterList, n):
if sorted(pseudoword) == list(pseudoword):
pwords.append("".join(pseudoword))
print (pwords)
with open(r'D:/words_alpha.txt', 'r') as f:
for word in f:
if "".join(sorted(word.strip())) in pwords:
print(word.strip())
toc=time.time()
print(toc-tic)