Python中具有深度参数的嵌套循环

4

如何制作一个嵌套循环,其中深度是一个参数。我考虑设计一个函数,该函数将深度作为参数。

def make_nested_loops(depth):
    ...

而当depth=3时,结果如下所示:

for i1 in range(10):
    for i2 in range(i1 + 1, 10):
        for i3 in range(i2 + 1, 10):
            # do stuff

目前我已经能够使用字符串构建和exec命令来实现这一点。但我认为有更好、更有效的方法来完成它。


嵌套循环会增加复杂度。你正在遍历什么,想要实现什么目标? - J0hn
为什么?内部循环依赖于包含的循环,因此您无法真正将其展平。 - chepner
1
顺便问一下,make_nested_loops 应该返回什么?循环不是一个对象,而是一种语法结构。或许它应该有第二个参数,这个参数是一个函数,接受一个元组 (i1, i2, ...) 作为参数,在 #do stuff 发生时调用该函数。 - chepner
@chepner 它应该返回一个元组列表或字典,其中每个元组的长度恰好为深度。 - JJ77
2个回答

1

我想你最多可以有21个嵌套循环。因此,你可以在函数中有21个嵌套循环,并在每次循环时检查是否达到所需的深度。如果没有达到,则将当前深度变量加一。


你可以拥有的最大嵌套循环数是21。来源在哪里? - Right leg
@Rightleg 我认为她可能是对的。我在这里检查了一下(http://bugs.python.org/issue986720),其中一位作者说20是最大值。虽然我还不是100%确定,但我仍在继续寻找。 - Christian Dean
2
@ChristianDean 嗯,我刚测试了一下,没错,19可以,但20不行。记录一下,它会出现“SyntaxError: too many statically nested blocks”错误。但是我确实想要一个来源。 - Right leg
2
实际上我不能给这个答案点赞,因为它并不是对问题的一个好回答,但是我想感谢你让我知道 Python 有这样一个限制。 - Right leg
1
我的经验告诉我,我曾尝试过创建大量嵌套循环,但当循环超过19次时程序就会崩溃。 - Cary Shindell
显示剩余2条评论

1
一个效率低但简单的方法是使用 itertools.product 并过滤不需要的元组:
def make_tuples(depth, n):
    for i in itertools.product(range(n), repeat=depth):
        if sorted(i) < i:
            continue
        yield i

更有效率的方式是使用递归生成器:

def make_tuples(depth, n, start=0):
    if depth == 0:
        yield ()
    else:
        for x in range(start, n):
            for t in make_tuples(depth - 1, n, x + 1):
                yield (x,) + t

使用它的样子会像这样:
for (i1, i2, i3) in make_tuples(3, 10):
    # do stuff with i1, i2, i3

如果深度确实是动态的,那么你当然不能拆开从make_tuples返回的元组。代码主体将不得不知道如何处理长度固定但未知的元组。
for tpl in make_tuples(n, 10):
    # Do stuff with tpl

不错。谢谢@chepner - JJ77

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接