Python如何结合itertools从字符串列表生成6字符长的所有合法有序组合
需求说明
现有由3字符、4字符字符串组成的列表,需生成总长度恰好为6字符的所有合法拼接序列,规则如下:
- 单个字符串内部字符顺序不可打乱,支持截断操作,允许省略列表元素的首位0
- 可选取任意数量的列表元素(或元素截断得到的子串)按任意顺序拼接,拼接后总长度为6即判定为合法
已尝试使用itertools生成全量可能结果,但缺少长度校验与合法片段筛选逻辑,需结合其他逻辑完成需求。
示例输入
wordlist = ["0254", "0294", "0284", "0289", "027", "024", "026", "088"]
合法结果参考
- 取自索引0、4元素的合法结果:
025427、254027、270254、027254 - 取自索引4、7元素的合法结果:
027088、088027 - 取自索引4、5、7元素的合法结果:
272488
实现方案
核心思路分三步:
- 预处理每个原始字符串,生成所有符合规则的可用片段,按片段长度分组存储
- 枚举所有可能的元素选取组合,为选中的元素枚举合法的片段长度分配方案,确保片段长度总和为6
- 生成对应长度的片段组合,枚举所有排列顺序拼接,用集合去重得到最终结果
完整可运行代码如下:
from itertools import combinations, permutations, product wordlist = ["0254", "0294", "0284", "0289", "027", "024", "026", "088"] result = set() # 生成单个字符串所有合法截断片段,按长度分组 def get_valid_parts(s): parts = set() n = len(s) # 枚举所有起止位置,覆盖截去开头(含省略首位0)、截去结尾的所有合法连续子串 for start in range(n): for end in range(start + 1, n + 1): parts.add(s[start:end]) parts_by_len = {} for p in parts: parts_by_len.setdefault(len(p), set()).add(p) return parts_by_len # 预处理所有词的可用片段 all_word_parts = [get_valid_parts(word) for word in wordlist] # 枚举选取元素的数量:单元素最长4位凑不足6位,最少选2个;每个元素至少贡献1字符,最多选6个 max_select = min(6, len(wordlist)) for k in range(2, max_select + 1): # 枚举选k个元素的所有索引组合 for selected in combinations(range(len(wordlist)), k): # 拿到每个选中元素支持的片段长度列表 lens_options = [list(all_word_parts[idx].keys()) for idx in selected] # 枚举所有长度分配组合,筛选总长度为6的方案 for lens in product(*lens_options): if sum(lens) != 6: continue # 拿到每个元素对应长度的所有可选片段 parts_options = [] for i, idx in enumerate(selected): parts_options.append(list(all_word_parts[idx][lens[i]])) # 枚举片段组合+所有排列顺序,拼接后存入结果集自动去重 for parts_group in product(*parts_options): for perm in permutations(parts_group): joint = ''.join(perm) if len(joint) == 6: result.add(joint) # 验证示例结果是否存在 check_items = ["025427", "254027", "270254", "027254", "027088", "088027", "272488"] for item in check_items: print(f"{item} 合法: {item in result}") print(f"总合法结果数:{len(result)}") # 需查看全量结果可打开下方注释 # print(sorted(result))
代码运行后会先校验所有给出的示例结果均在合法集合内,再输出总结果数量,可按需开启全量结果打印。
内容的提问来源于stack exchange,提问作者HThomas
相关产品推荐
相关产品推荐

