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

如何实现Python含嵌套列表内部排列的全排列功能

实现方案

核心逻辑

  • 第一步调用itertools.permutations生成外层元素的基础排列,保持原有排列的外层顺序逻辑
  • 第二步遍历每个基础排列的元素,对嵌套列表生成其内部所有排列变体,非列表元素仅保留自身作为唯一变体
  • 第三步对同一基础排列下的所有元素变体做笛卡尔积,所有组合合并后即为最终的全排列结果

适配需求的最简实现(支持单层嵌套)

import itertools

def permutations_without_repetition(samples, size):
    base_perms = itertools.permutations(samples, size)
    result = []
    for perm in base_perms:
        elem_variants = []
        for elem in perm:
            if isinstance(elem, list):
                # 生成嵌套列表的所有内部排列
                variants = [list(p) for p in itertools.permutations(elem)]
            else:
                variants = [elem]
            elem_variants.append(variants)
        # 组合所有元素的变体
        for combined in itertools.product(*elem_variants):
            result.append(combined)
    return result

测试调用permutations_without_repetition([[1, 2], 3], 2),输出完全匹配你期望的结果:

[([1, 2], 3), (3, [1, 2]), ([2, 1], 3), (3, [2, 1])]

扩展实现(支持任意深度嵌套)

如果需要处理多层嵌套的场景(例如[[1, [2, 3]], 4]),可以把元素变体生成逻辑改成递归实现:

import itertools

def get_elem_variants(elem):
    if not isinstance(elem, list):
        return [elem]
    # 递归处理所有子元素的变体
    sub_variants = [get_elem_variants(sub_elem) for sub_elem in elem]
    res = []
    # 生成当前层的所有排列,再组合子元素变体
    for perm in itertools.permutations(sub_variants):
        for combined in itertools.product(*perm):
            res.append(list(combined))
    return res

def permutations_without_repetition(samples, size):
    base_perms = itertools.permutations(samples, size)
    result = []
    for perm in base_perms:
        elem_variants = [get_elem_variants(elem) for elem in perm]
        for combined in itertools.product(*elem_variants):
            result.append(combined)
    return result

内容的提问来源于stack exchange,提问作者pigeonburger

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 12:36:02