如何用Python实现无需全量存储结果的N层嵌套循环生成函数
解决方案
你可以将原函数改为生成器实现,无需预先生成全量结果列表,仅在迭代时动态生成每一组结果:
def multi_range(range_func, N, sofar=None): if sofar is None: sofar = [] for a in range_func(): current = sofar + [a] if N == 1: yield current else: yield from multi_range(range_func, N - 1, current)
测试代码
沿用你原有测试逻辑即可,输出结果和之前完全一致:
def test_range(): yield 0 yield 1 for b in multi_range(test_range, 3): print(b)
改动说明
- 移除了用于存储全量结果的
results参数,不再占用大量内存存储所有组合 - 匹配到N=1的终止条件时,用
yield返回当前组合而非追加到列表 - 递归调用时通过
yield from透传子层级生成的所有组合 - 整体内存占用仅为O(N)(仅存储当前正在生成的组合路径以及递归栈,和总组合数无关)
更简洁的标准库方案
Python内置的itertools.product已经原生实现了该功能,性能更优且无需自行实现递归逻辑:
from itertools import product def test_range(): yield 0 yield 1 # repeat参数对应循环层数N,返回结果为元组,按需转列表即可 for b in product(test_range(), repeat=3): print(list(b))
内容的提问来源于stack exchange,提问作者T. Smith
相关产品推荐
相关产品推荐

