You need to enable JavaScript to run this app. 如何递归或循环遍历未知长度嵌套列表各子列表的全排列组合
优惠活动
大模型
产品
解决方案
定价
更多

如何递归或循环遍历未知长度嵌套列表各子列表的全排列组合

解决方案

你要的效果可以直接用Python标准库itertools的permutations和product组合实现,无需手写可变层数的嵌套循环,也不需要手动处理递归状态留存问题:

实现思路

  1. 对嵌套列表中的每一个子列表,预先生成其所有全排列序列
  2. 对所有子列表的全排列序列求笛卡尔积,笛卡尔积的默认迭代顺序完全匹配你要求的类二进制遍历规则:最右侧的子列表先遍历所有排列,全部遍历完成后左侧相邻子列表步进一个排列,右侧子列表重新开始遍历,以此类推
  3. 用生成器返回结果,避免一次性加载所有组合占用过多内存

代码实现

import itertools

def traverse_nested_permutations(original_nested_list):
    # 为每个子列表生成全排列
    sub_permutations = [itertools.permutations(sublist) for sublist in original_nested_list]
    # 遍历所有组合的笛卡尔积
    for combination in itertools.product(*sub_permutations):
        # 转换为列表格式返回,适配后续处理需求
        yield [list(item) for item in combination]

# 测试用例:和你给出的示例一致,3个长度为2的子列表
if __name__ == "__main__":
    test_input = [[0,1], [0,1], [0,1]]
    for res in traverse_nested_permutations(test_input):
        print(res)

递归实现版本(如果不想依赖itertools.product)

如果你希望自己实现逻辑不依赖标准库的笛卡尔积方法,可以用递归+回溯的方式实现,也不存在状态丢失的问题:

import itertools

def recursive_traverse(nested_list, index=0, current=None):
    if current is None:
        current = []
    # 所有子列表都处理完成,返回当前组合
    if index == len(nested_list):
        yield [list(item) for item in current]
        return
    # 遍历当前层级子列表的所有排列
    for perm in itertools.permutations(nested_list[index]):
        current.append(perm)
        # 递归处理下一层子列表
        yield from recursive_traverse(nested_list, index + 1, current)
        # 回溯,移除当前排列尝试下一个
        current.pop()

两种实现的输出结果完全一致,均匹配你要求的遍历顺序。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.14 05:27:03