不使用Itertools生成不定长列表数组全元素组合的方法
解决方案
首先纠正一个误解:itertools.product(*array_of_lists)本身是惰性迭代器,不会一次性将所有组合加载到内存中,只会在你迭代它(比如用for循环遍历)的时候逐个生成结果,所以正常情况下不会引发内存溢出。如果你只是需要逐个处理组合而不是一次性保存所有结果,直接用它就完全没问题,示例代码如下:
import itertools array_of_lists = [[1,2], [3,4], [5,6]] for combo in itertools.product(*array_of_lists): # 在这里处理单个组合,比如打印或业务计算 print(combo)
如果因为某些原因你不想依赖itertools模块,可以自己实现一个递归生成器函数,同样是惰性生成组合,不占用过多内存:
def recursive_product(lists): if not lists: yield () return first_list, rest_lists = lists[0], lists[1:] for item in first_list: for combo in recursive_product(rest_lists): yield (item,) + combo # 使用示例 array_of_lists = [[1,2], [3,4], [5,6]] for combo in recursive_product(array_of_lists): print(combo)
这个递归函数的核心逻辑:
- 当传入的列表数组为空时,返回空元组(递归终止条件)
- 取出第一个列表,遍历其中的每个元素
- 递归处理剩余的列表数组,将当前元素与递归得到的每个组合拼接后返回
不管是itertools.product还是自定义的递归生成器,都能满足“无需保存所有迭代结果”且“列表个数无需预先定义”的需求。
内容的提问来源于stack exchange,提问作者Mjom
相关产品推荐
相关产品推荐

