You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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
实现方案

核心思路分三步:

  1. 预处理每个原始字符串,生成所有符合规则的可用片段,按片段长度分组存储
  2. 枚举所有可能的元素选取组合,为选中的元素枚举合法的片段长度分配方案,确保片段长度总和为6
  3. 生成对应长度的片段组合,枚举所有排列顺序拼接,用集合去重得到最终结果

完整可运行代码如下:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 18:42:37