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

