如何递归或循环遍历未知长度嵌套列表各子列表的全排列组合
解决方案
你要的效果可以直接用Python标准库itertools的permutations和product组合实现,无需手写可变层数的嵌套循环,也不需要手动处理递归状态留存问题:
实现思路
- 对嵌套列表中的每一个子列表,预先生成其所有全排列序列
- 对所有子列表的全排列序列求笛卡尔积,笛卡尔积的默认迭代顺序完全匹配你要求的类二进制遍历规则:最右侧的子列表先遍历所有排列,全部遍历完成后左侧相邻子列表步进一个排列,右侧子列表重新开始遍历,以此类推
- 用生成器返回结果,避免一次性加载所有组合占用过多内存
代码实现
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
相关产品推荐
相关产品推荐

