Python生成字母所有非全量使用组合的代码问题求助
解决Python生成所有长度非空字母组合的问题
看起来你需要生成输入字母的所有非空长度的排列/组合,而不仅仅是和输入长度相同的结果。你的当前代码用了product(letters, repeat=len(letters)),这只会生成长度等于输入字母数量的笛卡尔积(允许重复字符),所以自然得不到短长度的结果。
下面分两种常见场景给出解决方案:
场景1:允许重复使用字母(比如生成aa、aba这类结果)
如果允许同一个字母在结果中多次出现,我们可以遍历从1到输入字母长度的所有可能长度,对每个长度调用product,然后把所有结果收集起来:
from itertools import product def algorithm(letters): possible = [] # 遍历长度1到len(letters) for length in range(1, len(letters)+1): # 生成当前长度的所有笛卡尔积组合 combinations = [''.join(comb) for comb in product(letters, repeat=length)] possible.extend(combinations) return possible print(algorithm(['a','b','c','d','e']))
这段代码会生成所有长度1到5的字符串,比如a、b、...、aa、ab、...、abcde、abcdb等等。
场景2:不允许重复使用字母(即生成排列,比如abc、cba但不生成aab)
如果你的需求是每个结果里的字母不重复(也就是排列),那应该用itertools.permutations而不是product,同样遍历所有长度:
from itertools import permutations def algorithm(letters): possible = [] for length in range(1, len(letters)+1): # 生成当前长度的所有排列 combinations = [''.join(comb) for comb in permutations(letters, length)] possible.extend(combinations) return possible print(algorithm(['a','b','c','d','e']))
这个版本会生成你例子里提到的abc、cba、de、ad这类结果,同时不会出现重复字母的字符串。
补充说明
- 如果你的“组合”指的是不考虑顺序的集合(比如
abc和cba算同一个),那应该用itertools.combinations,但从你给出的例子abc、cba都需要来看,你实际需要的是排列,所以上面的场景2更符合你的需求。 - 注意:当输入字母数量较多时,这些方法生成的结果数量会非常大(比如5个字母的场景,场景2的结果总数是5+20+60+120+120=325个,场景1则是5+25+125+625+3125=3905个),要注意内存使用。
内容的提问来源于stack exchange,提问作者Stqrosta
相关产品推荐
相关产品推荐

