如何增量生成符合规则的命令字符串与数字交替组合序列
实现方案
核心逻辑拆解
所有合法字符串都由≥1个独立单元拼接而成,每个单元固定为「命令字符串 + 非空数字排列串」的结构,天然满足全部规则:
- 单元本身以命令开头、数字结尾,多单元拼接后整体依然符合开头为命令、结尾为数字的要求
- 命令后仅接数字,不存在连续命令的情况
- 完全遵循「命令+数字序列」的交替规则
可运行代码实现
from itertools import permutations, product from pprint import pprint # 定义基础集合 NUMBERS = [0, 1, 2, 3, 4, 5, 6] COMMANDS = ['open', 'start', 'finish', 'quit', 'destroy'] # 可自行调整最大拼接轮次,避免生成数量过多 MAX_ROUND = 3 def generate_num_strings(): """生成所有合法的非空数字排列串""" # 数字串长度从1到7(NUMBERS总长度) for length in range(1, len(NUMBERS)+1): for perm in permutations(NUMBERS, length): # 排列转字符串,比如(1,2,3)转成"123" yield ''.join(map(str, perm)) def generate_units(): """生成所有「命令+数字串」基础单元""" for cmd, num_str in product(COMMANDS, generate_num_strings()): yield f"{cmd}{num_str}" def generate_all_combinations(): """生成所有符合规则的完整组合""" # 轮次从1到MAX_ROUND for round_cnt in range(1, MAX_ROUND+1): # 每次取round_cnt个单元拼接 for units in product(generate_units(), repeat=round_cnt): yield ''.join(units) # 示例:输出前20个结果测试 if __name__ == '__main__': res = generate_all_combinations() pprint([next(res) for _ in range(20)])
参数调整说明
- 如果需要限制数字串的最大长度,可以修改
generate_num_strings函数里range(1, len(NUMBERS)+1)的上限 - 如果需要生成更多轮次的长组合,修改
MAX_ROUND即可,注意轮次越高生成的结果数量越大,避免设置过大导致内存占用过高
内容的提问来源于stack exchange,提问作者Passaro
相关产品推荐
相关产品推荐

