Skip to main content
 首页 » 编程设计

python之列出所有可能包含 n 个字母的单词

2025年05月04日14zengkefu

我想列出所有可能包含 n 个字母的单词,其中第一个字母可以是 a1 或 a2,第二个可以是 b1、b2 或 b3,第三个可以是 c1 或 c2,...这是一个简单的示例输入- n=2 的输出,每个字母有 2 个备选方案:

  • 输入 = [["a","b"],["c","d"]]
  • output = ["ac", "ad", "bc", "bd"]

我尝试通过首先使用前 2 个字母创建所有可能的单词来递归地执行此操作,所以像这样:

def go(l): 
    if len(l) > 2: 
        head = go(l[0:2]) 
        tail = l[2:] 
        tail.insert(0, head) 
        go(tail) 
    elif len(l) == 2: 
        res = [] 
        for i in l[0]: 
            for j in l[1]: 
                res.append(i+j) 
        return res 
    elif len(l) == 1: 
        return l 
    else: 
        return None 

但是,对于较大的 n 或每个字母有很多替代方案,这变得非常慢。解决这个问题的更有效方法是什么?

谢谢

请您参考如下方法:

我想你只是想要itertools.product这里:

>>> from itertools import product 
>>> lst = ['ab', 'c', 'de'] 
>>> words = product(*lst) 
>>> list(words) 
[('a', 'c', 'd'), ('a', 'c', 'e'), ('b', 'c', 'd'), ('b', 'c', 'e')]` 

或者,如果您希望将它们连接成单词:

>>> [''.join(word) for word in product(*lst)] 
['acd', 'ace', 'bcd', 'bce'] 

或者,以你的例子:

>>> lst = [["a","b"],["c","d"]] 
>>> [''.join(word) for word in product(*lst)] 
['ac', 'ad', 'bc', 'bd'] 

当然,对于非常大的 n 或非常大的字母集(大小 m),这会很慢。如果要生成指数级大的输出集 (O(m**n)),这将花费指数时间。但至少它具有常数空间而不是指数空间(它一次生成一个产品,而不是所有产品的巨大列表),并且会比你在去往的路上快一个不错的常数因子,而且它是更简单,也更难出错。