有没有一种python itertools方法来生成这些数据?

Is there a python itertools way of generating this data?

提问人:fundamental 提问时间:10/16/2023 更新时间:10/16/2023 访问量:85

问:

我有以下功能:

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-itertools

评论


答:

1赞 Marcin Orlowski 10/16/2023 #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)]
2赞 DeepSpace 10/16/2023 #2

使用 itertools.product

import itertools

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)]

这也可以概括为:

def generate(n):
    return list(itertools.product(*(range(i) for i in range(n, 1, -1))))
0赞 slothrop 10/16/2023 #3

如果要推广到任意深度,可以在推导式生成的可迭代对象序列上使用:itertools.product

import itertools

def combs(w, depth):
    # Returns an iterator object which yields the combinations
    return itertools.product(*(range(w-n) for n in range(depth)))

print(list(combs(4,3)))

哪些输出(整理格式以匹配您的格式):

[(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)]

评论

0赞 slothrop 10/16/2023
@MarcinOrlowski我完全支持该政策,并且确实试图追踪 ChatGPT 生成的答案。我没有使用 ChatGPT 来回答这个答案,或者我确实在这里发布过的任何答案——这将是 100% 违背我对此的信念。