python - 需要找到一组字符的所有可能组合
问题描述
我想获取一组存储在数组中的 9 个字符,并获取可以用这些字符组成的所有字符串组合。然后将结果与文本文件进行比较,如果一个单词匹配,则该单词应输出回给用户。
目前我正在使用该itertools.combinations
函数来尝试获取所有组合 - 我遇到的问题是程序以所有 9 个字母组合开头,如果这些组合中没有一个与文本文件中的单词匹配,那么程序会尝试8 个字母组合,依此类推,直到找到一个单词或没有匹配的单词。
lengthofword = 9
foundwords = False
count = 0
while foundwords == False:
wordcombos = [''.join(i) for i in itertools.combinations(letters,lengthofword)]
#print(wordcombos)
#print(len(wordcombos))
count = 0
for i in range(0,len(wordcombos)):
if count == len(wordcombos)-1:
print("gone through each word")
if lengthofword > 0:
lengthofword = lengthofword -1
elif lengthofword == 0:
print("there are no words with those letters")
foundwords = True
elif wordcombos[i] in gamewords:
print("the best anwser is " +wordcombos[i])
foundwords = True
elif wordcombos[i] not in gamewords:
count = count + 1
print(count)
应该发生的是,将提供的字符的 9 个长度组合与文本文件进行比较 - 问题是没有显示所有组合,因为当减小以查看是否有任何itertools
传入的字母时,不使用传入的某些字母lengthofword
匹配的较小的单词。例如,如果字母 RQLCWUOUI 被传递到单词“curl”应该出现在 4 个字母的单词组合下但不存在。
解决方案
要生成具有所有可能长度的所有排列,我建议使用itertools.permutations
, 并itertools.chain
连接迭代器:您不想在内存中生成所有这些排列,因为可能性太多。
import itertools
letters = ["R", "Q", "L", "C", "W", "U", "O", "U", "I"]
allCombinations = itertools.chain(*(("".join(l) for l in itertools.permutations(letters, length)) for length in range(1, len(letters))))
然后,您可以使用一个简单的循环遍历所有这些for
:
for word in allCombinations:
# do stuff
如果您的初始字母集包含重复,这可能会产生重复。
请注意,正如一些评论中所说,这是在文本中查找单词的一种非常低效的方法,因为要查找的次数非常多。
推荐阅读
- java - for 循环在 i++ 处有“死代码”
- javascript - 在 JSX 中显示状态列表
- r - ggplot2中的多个分组
- python - 用于主题建模的 K-Means - 肘部方法
- python - Pandas split-apply-combine,为什么在排序时结合 pd.concat([df]) 起作用?
- jquery - 如何使用 jQuery 更改多个克隆的 HTML 元素的属性值?
- mysql - 无法创建与数据库的连接 (ColdFusion)
- mysql - 使用 Promise 使用 Node.JS 和 MySQL 生成 Tree 结果
- python - 带有 cx_Freeze 的 Pyserial 运行时错误
- googlebot - 谷歌真的想找到 admin.php 吗?