提问人:fundamental 提问时间:10/16/2023 更新时间:10/16/2023 访问量:85
有没有一种python itertools方法来生成这些数据?
Is there a python itertools way of generating this data?
问:
我有以下功能:
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 等标准库生成此类数据吗?
答:
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
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% 违背我对此的信念。
上一个:遍历不同的列表
评论