Вот почему itertools.product
существует:
import itertools
L = range(60,145) # table length options (60"-144")
D = range(30,55) # table depth options (30"-54")
H = range(30,45) # table height options (30"-44")
T = range(3,9) # tabletop thickness options (3/4"-2")
O = range(10,23) # table end overhang options (10"-22")
class Part:
def __init__(self, dims):
self._dims = dims
@property
def unique(self):
return list(itertools.product(*self._dims))
>>> Part((T,H)).unique
[(3, 30), (3, 31), (3, 32), (3, 33), (3, 34), ..., (8, 39), (8, 40), (8, 41), (8, 42), (8, 43), (8, 44)]
Если вы хотите создать собственную реализацию, вам следует использовать рекурсивную функцию:
>>> def cprod(*dims):
... if len(dims) == 0: return []
... if len(dims) == 1: return list(dims[0])
... def cprod_aux(d, *ds):
... return [(x, *y) for x in d for y in cprod_aux(*ds)] if ds else ((x,) for x in d)
... return cprod_aux(*dims)
>>> cprod()
[]
>>> cprod(D)
[30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54]
>>> cprod(L, D, H)
[(60, 30, 30), (60, 30, 31), (60, 30, 32), (60, 30, 33), (60, 30, 34), (60, 30, 35), ..., (144, 54, 39), (144, 54, 40), (144, 54, 41), (144, 54, 42), (144, 54, 43), (144, 54, 44)]
Реализация наивна (выможет использовать некоторые памятка )