有 python itertools 生成此数据的方法吗?

问题描述 投票:0回答:2

我有以下功能:

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 或 numpy)生成此类数据吗?

python combinations python-itertools
2个回答
1
投票

您正在生成笛卡尔积吗?如果是这样,搜索“笛卡尔积”应该会引导您到 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)]

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)]
© www.soinside.com 2019 - 2024. All rights reserved.