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

如何用Python实现多列表组合(不使用n层嵌套循环)

问题描述

给定一个n维列表(n-list-of-lists),结构如下:

[
    [a,   b,  c],
    [p,   q,  r],
    ..,
    ..,
    [x,   y,  z]
]

需要生成结果列表,其中每个子列表由原列表中每个子列表各选一个元素组成,示例结果如下:

[
    [a, p, .., x],
    [a, p, .., y],
    [a, p, .., z],
    ..
    ..
    [c, r, .., z]
]

由于输入的n维列表的层数n在运行时才能确定,无法使用n层嵌套for循环,请问该如何实现?

解决方案

方法一:用Python标准库itertools.product直接实现

Python自带的itertools模块里的product函数,专门用来生成多个可迭代对象的笛卡尔积,完美贴合你的需求。不管输入有多少个子列表(n的值不确定),它都能自动处理,完全不用写嵌套循环。

示例代码:

import itertools

def generate_cartesian_product(input_list):
    # 把product返回的元组转换成列表格式
    return [list(item) for item in itertools.product(*input_list)]

# 测试用例
input_data = [['a', 'b', 'c'], ['p', 'q', 'r'], ['x', 'y', 'z']]
result = generate_cartesian_product(input_data)
for sub_list in result:
    print(sub_list)

运行这段代码就能得到所有符合要求的子列表,每个子列表依次从原列表的每个子列表里选一个元素。

方法二:自己写递归函数实现

如果不想依赖标准库,也可以用递归的方式来实现,核心思路是把问题逐层拆解:

def recursive_cartesian(input_list):
    # 递归终止条件:输入列表为空时,返回包含空列表的列表作为基础
    if not input_list:
        return [[]]
    # 取出第一个子列表,递归处理剩下的子列表
    first_sub = input_list[0]
    rest_result = recursive_cartesian(input_list[1:])
    # 把第一个子列表的每个元素,和剩余部分的每个结果拼接起来
    return [[item] + sub_list for item in first_sub for sub_list in rest_result]

# 测试用例
input_data = [['a', 'b', 'c'], ['p', 'q', 'r'], ['x', 'y', 'z']]
result = recursive_cartesian(input_data)
for sub_list in result:
    print(sub_list)

递归的逻辑是:每次只处理第一个子列表,把它的每个元素和剩下的子列表生成的笛卡尔积结果组合,直到输入列表为空时返回最基础的空列表,再逐层向上拼接出最终的所有结果。

内容的提问来源于stack exchange,提问作者Darth.Vader

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 07:26:18