任意深度嵌套循环

时间:2019-09-18 08:48:58

标签: python python-3.x algorithm recursion

如何将以下内容转换为可以以任意深度的方式累积列表列表的递归函数?

def do_list(n):
    ls = []

    for a in range(10):
        for b in range(10):
            for c in range(10):
                ls.append([a, b, c])

    return ls

例如do_list(10, 4)可以做到:

for a in range(10):
    for b in range(10):
        for c in range(10):
            for d in range(10):
                ls.append([a, b, c, d])

do_list(10, 5)可以做到:

for a in range(10):
    for b in range(10):
        for c in range(10):
            for d in range(10):
                for e in range(10):
                    ls.append([a, b, c, d, e])

2 个答案:

答案 0 :(得分:1)

要回答实际问题,如何将其转换为递归函数,请尝试如下操作:

def do_list(n):
    if n <= 0:
        yield []
    else:
        for res in do_list(n-1):
            for x in range(10):
                yield [*res, x]

for x in do_list(5):
    print(x)

基本上,如果n为零(或更小),则只生成一个空列表,否则将生成n-1的所有结果,并将每个数字附加到每个数字上。请注意,这是使用yield generator 函数,但是您也可以将结果收集在列表中,然后返回该列表(对于n较大的值,不过不明智):

def do_list(n):
    if n <= 0:
        return [[]]
    else:
        result = []
        for res in do_list(n-1):
            for x in range(10):
                result.append(res + [x])
        return result

但是,对于此特定功能,并使用Python,您可能应该使用itertools.product

import itertools
for x in itertools.product(range(10), repeat=5):
    print(x)

答案 1 :(得分:0)

只需使用itertools.product

import itertools

def do_list(n, d):
    return list(itertools.product(*(range(n) for _ in range(d))))

这里有live example

@tobias_k的想法可能更好,请使用功能的重复功能代替生成器:

def do_list(n, d):
    return list(itertools.product(range(n), repeat=d))