如何实现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
相关产品推荐
相关产品推荐

