首页 > 解决方案 > 需要找到一组字符的所有可能组合

问题描述

我想获取一组存储在数组中的 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 个字母的单词组合下但不存在。

标签: python

解决方案


要生成具有所有可能长度的所有排列,我建议使用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

如果您的初始字母集包含重复,这可能会产生重复。

请注意,正如一些评论中所说,这是在文本中查找单词的一种非常低效的方法,因为要查找的次数非常多。


推荐阅读