如何将以下内容转换为可以以任意深度的方式累积列表列表的递归函数?
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])
答案 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))