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

如何手动实现可变长度嵌套列表的笛卡尔积?

手动实现通用笛卡尔积功能

问题场景

给定嵌套列表:

a = [[1, 2], [3, 4], [5, 6]]

需要生成所有元素的笛卡尔积,预期结果:

[(1, 3, 5), (1, 3, 6), (1, 4, 5), (1, 4, 6), (2, 3, 5), (2, 3, 6), (2, 4, 5), (2, 4, 6)]

当前用固定层数嵌套循环实现,但嵌套列表长度变化时需手动调整循环层数,希望手动实现通用的笛卡尔积逻辑,替代itertools.product。

实现方案

方法1:递归实现

通过递归拆分问题,将多列表的笛卡尔积拆解为单列表元素与剩余列表笛卡尔积的组合:

def my_product(lists):
    # 终止条件:空列表返回包含空元组的列表,作为组合的基础
    if not lists:
        return [()]
    # 拆分第一个子列表和剩余列表
    first_list = lists[0]
    rest_product = my_product(lists[1:])
    # 组合第一个列表的每个元素与剩余列表的所有组合
    return [(item,) + combo for item in first_list for combo in rest_product]

# 测试
a = [[1, 2], [3, 4], [5, 6]]
print(my_product(a))

方法2:迭代实现

从空元组开始,逐个处理每个子列表,逐步扩展组合结果:

def my_product(lists):
    # 初始结果为包含空元组的列表
    result = [()]
    for current_list in lists:
        temp = []
        # 将现有每个组合与当前列表的元素拼接
        for combo in result:
            for item in current_list:
                temp.append(combo + (item,))
        result = temp
    return result

# 测试
a = [[1, 2], [3, 4], [5, 6]]
print(my_product(a))

原理说明

  • 递归方式:不断缩小问题规模,把n个列表的笛卡尔积转化为「第一个列表元素」和「n-1个列表的笛卡尔积」的拼接,直到处理完所有列表。
  • 迭代方式:从最基础的空组合出发,每处理一个子列表就更新一次结果集,最终得到所有可能的元素组合。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 08:06:22