首页 > 解决方案 > Python N 嵌套循环

问题描述

所以这是我想做的一个例子。

def multi_range(range_func):
    for a in range_func():
        for b in range_func():
            yield a, b

但是,我真正想要的是适用于 N 循环的东西。我会想这样的事情。

def multi_range(range_func, N, sofar=None, results=None):
    if sofar is None:
        sofar = []

    if results is None:
        results = []

    for a in range_func():
        if N == 1:
            results.append(sofar + [a])
        else:
            multi_range(range_func, N - 1, sofar + [a], results)

    return results

def test_range():
    yield 0
    yield 1

for b in multi_range(test_range, 3):
    print(b)

这会正确输出以下内容。

[0, 0, 0]
[0, 0, 1]
[0, 1, 0]
[0, 1, 1]
[1, 0, 0]
[1, 0, 1]
[1, 1, 0]
[1, 1, 1]

这里的问题是它必须创建整个列表并将其存储在内存中。例如,如果使用 test_range 代替,则会消耗大量内存。

def test_range():
    for x in range(10000):
        yield x

(是的,我知道有一个与 range 行为相同的 range 包装器很奇怪。这只是一个例子)

那是我的问题。如何在不将所有结果存储在列表中的情况下编写一个行为类似于此的函数?

标签: python

解决方案


使用itertools.product

>>> from itertools import product
>>> def test_range():
...     yield 0
...     yield 1
...
>>> for b in product(test_range(), repeat=3):
...     print(b)
...
(0, 0, 0)
(0, 0, 1)
(0, 1, 0)
(0, 1, 1)
(1, 0, 0)
(1, 0, 1)
(1, 1, 0)
(1, 1, 1)

如果您好奇这是如何实现的,请参阅链接文档中的示例实现。


推荐阅读