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

数组排列问题:如何获取多数组各取一个元素的所有组合

多集合笛卡尔积生成算法

需求说明

你需要的是多集合笛卡尔积计算逻辑:给定多层嵌套列表,从每一层列表中各选取1个元素,输出所有可能的组合。

示例输入:
[['a', 'b', 'c'], ['e', 'f'], ['g', 'h', 'i']]
示例输出包含所有3×2×3=18种合法组合,例如['a','e','g']、['a','e','h']、['a','e','i']等。


实现思路

两种常见实现逻辑可选:

  • 迭代法:初始结果集设为[[]],依次遍历每一层子列表,将当前结果集的每一项和子列表的每个元素拼接生成新结果集,直到遍历完所有子列表
  • 回溯法:递归遍历每一层元素,选完当前层元素后进入下一层,选完所有层元素就存入结果集

代码实现

Python 内置方法实现

Python标准库itertools的product方法可以直接实现需求:

from itertools import product

input_lists = [['a', 'b', 'c'], ['e', 'f'], ['g', 'h', 'i']]
# product返回元组格式,按需转列表即可
result = [list(item) for item in product(*input_lists)]

# 打印验证结果
for item in result:
    print(item)

无依赖迭代实现

如果不想依赖第三方/内置库,可以手动写迭代逻辑:

def cartesian_product(lists):
    result = [[]]
    for sub_list in lists:
        temp = []
        for res_item in result:
            for elem in sub_list:
                temp.append(res_item + [elem])
        result = temp
    return result

input_lists = [['a', 'b', 'c'], ['e', 'f'], ['g', 'h', 'i']]
print(cartesian_product(input_lists))

回溯法实现

def cartesian_product_backtrack(lists):
    result = []
    def backtrack(index, current):
        # 遍历完所有子列表,存入结果
        if index == len(lists):
            result.append(current.copy())
            return
        # 遍历当前子列表所有元素
        for elem in lists[index]:
            current.append(elem)
            backtrack(index + 1, current)
            current.pop()
    backtrack(0, [])
    return result

input_lists = [['a', 'b', 'c'], ['e', 'f'], ['g', 'h', 'i']]
print(cartesian_product_backtrack(input_lists))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 01:06:08