如何用Python生成数组所有长度的全字符组合(含重复有序,限长30)
需求说明
需要生成数组 ["a", "b", "c"] 的所有可能字符组合,要求:
- 包含重复元素的组合(如
('b', 'b')) - 包含不同顺序的组合(如
('b', 'a')) - 组合最长长度限制为30个字符
- 代码需高效
此前使用 itertools.combinations 的代码仅能生成无重复的无序组合,无法满足需求,相关错误代码及输出如下:
错误代码示例1
import itertools stuff = ["a", "b", "c"] for L in range(len(stuff) + 1): for subset in itertools.combinations(stuff, L): print(subset)
错误代码示例2
from itertools import chain, combinations def all_subsets(ss): return chain(*map(lambda x: combinations(ss, x), range(0, len(ss)+1))) stuff = ["a", "b", "c"] for subset in all_subsets(stuff): print(subset)
错误代码输出
() ('a',) ('b',) ('c',) ('a', 'b') ('a', 'c') ('b', 'c') ('a', 'b', 'c')
期望输出示例
() ('a',) ('b',) ('c',) ('a', 'a') ('a', 'b') ('a', 'c') ('b', 'a') ('b', 'b') ('b', 'c') ('c', 'a') ('c', 'b') ('c', 'c') ('a', 'b', 'c') ...
即模拟仅含A、B、C键的键盘可输入的所有内容,允许重复输入同一字符,最长长度30。
解决方案
要实现需求,应使用 itertools.product 替代 itertools.combinations:
itertools.product生成输入可迭代对象的笛卡尔积,支持重复选取元素且保留顺序- 遍历从0到30的所有长度,对每个长度生成对应组合(长度0对应空元组)
高效实现代码
import itertools stuff = ["a", "b", "c"] max_length = 30 # 输出空元组 print(()) # 遍历1到max_length的所有长度 for length in range(1, max_length + 1): # 生成对应长度的所有有序可重复组合 for combo in itertools.product(stuff, repeat=length): print(combo)
代码说明
- 单独输出空元组,因为
itertools.product的repeat参数不能为0 itertools.product是迭代器实现,不会一次性生成所有组合占用大量内存,符合高效要求- 若需收集所有组合到列表(注意:长度30时总组合数约为2e14,内存无法容纳,仅适合较小的max_length):
import itertools stuff = ["a", "b", "c"] max_length = 30 all_combinations = [()] for length in range(1, max_length + 1): all_combinations.extend(itertools.product(stuff, repeat=length))
内容的提问来源于stack exchange,提问作者Voil
相关产品推荐
相关产品推荐

