我有以下功能:
def e(w):
for i in range(w):
for j in range(w-1):
for k in range(w-2):
yield [i,j,k]
print([i for i in e(4)])
生成如下数据:
[[0, 0, 0], [0, 0, 1], [0, 1, 0], [0, 1, 1], [0, 2, 0], [0, 2, 1],
[1, 0, 0], [1, 0, 1], [1, 1, 0], [1, 1, 1], [1, 2, 0], [1, 2, 1],
[2, 0, 0], [2, 0, 1], [2, 1, 0], [2, 1, 1], [2, 2, 0], [2, 2, 1],
[3, 0, 0], [3, 0, 1], [3, 1, 0], [3, 1, 1], [3, 2, 0], [3, 2, 1]]
我已将 e() 推广为递归函数 f() :
def f(w, mx=0, depth=0, values=[]):
if mx==0:
yield values
for i in range(w - depth):
yield from f(w, mx-1, depth+1, values + [i])
print([i for i in f(4,3)])
生成相同的数据。您正在生成笛卡尔积吗?如果是这样,搜索“笛卡尔积”应该会引导您到 itertools.product():
from itertools import product
def generate_data(w):
return product(range(w), range(w-1), range(w-2))
print(list(generate_data(4)))
输出相同的值(不同之处在于使用元组而不是列表):
[(0, 0, 0), (0, 0, 1), (0, 1, 0), (0, 1, 1), (0, 2, 0), (0, 2, 1),
(1, 0, 0), (1, 0, 1), (1, 1, 0), (1, 1, 1), (1, 2, 0), (1, 2, 1),
(2, 0, 0), (2, 0, 1), (2, 1, 0), (2, 1, 1), (2, 2, 0), (2, 2, 1),
(3, 0, 0), (3, 0, 1), (3, 1, 0), (3, 1, 1), (3, 2, 0), (3, 2, 1)]
使用
itertools.product
:
print(list(itertools.product(range(4), range(3), range(2))))
[(0, 0, 0), (0, 0, 1), (0, 1, 0), (0, 1, 1), (0, 2, 0), (0, 2, 1),
(1, 0, 0), (1, 0, 1), (1, 1, 0), (1, 1, 1), (1, 2, 0), (1, 2, 1),
(2, 0, 0), (2, 0, 1), (2, 1, 0), (2, 1, 1), (2, 2, 0), (2, 2, 1),
(3, 0, 0), (3, 0, 1), (3, 1, 0), (3, 1, 1), (3, 2, 0), (3, 2, 1)]