This function is equivalent to the following code, except that the actual implementation does not build up intermediate results in memory:
def product(*args, **kwds):
# product('ABCD', 'xy') --> Ax Ay Bx By Cx Cy Dx Dy
# product(range(2), repeat=3) --> 000 001 010 011 100 101 110 111
pools = map(tuple, args) * kwds.get('repeat', 1)
result = [[]]
for pool in pools:
result = [x+[y] for x in result for y in pool]
for prod in result:
yield tuple(prod)
def tup4(n):
for i in range(n):
for j in range(n):
for k in range(n):
for l in range(n):
yield (i, j, k, l)
for (i, j, k, l) in tup4(3):
# do your stuff
from itertools import product
def product_of_ranges(*ns):
for t in product(*map(range, ns)):
yield t
for i, j, k in product_of_ranges(4, 2, 3):
# do stuff
根据您想要做的,您可以使用^{} 模块来最小化} )。在这种情况下,^{} 将创建您对4个循环所做的操作:
for
循环(或^{在您的代码中,您可以:
^{pr2}$编辑:正如@PeterE在评论中所说,
product()
即使范围长度不同,也可以使用:它不会更简洁,因为它会花费您一个生成器函数,但至少您不会被PEP8困扰:
(在python2.x中,您应该在generator函数中使用})
xrange
而不是{编辑:
当已知金字塔的深度时,上述方法应该是好的。但您也可以通过这种方式制作通用生成器,而无需任何外部模块:
^{pr2}$(我使用
(l, k, j, i)
,因为在上面的生成器中,第一个索引首先变化)使用
itertools.product
是个好主意。这里有一个更通用的方法,可以支持不同大小的范围。在相关问题 更多 >
编程相关推荐