listOLists = [[1,2,3],[4,5,6],[7,8,9,10]] for l in itertools.product(*listOLists): print(l)
Ответ 3
Наиболее элегантным решением является использование itertools.product в python 2.6.
Если вы не используете Python 2.6, в документации для itertools.product фактически показана эквивалентная функция для создания продукта "ручным" способом:
defproduct(*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: yieldtuple(prod)
Ответ 4
Нет ничего плохого в прямой рекурсии для этой задачи, нет необходимости во внешних зависимостях, и если вам нужна версия, которая работает со строками, это может соответствовать вашим потребностям:
combinations = []
defcombine(terms, accum): last = (len(terms) == 1) n = len(terms[0]) for i inrange(n): item = accum + terms[0][i] if last: combinations.append(item) else: combine(terms[1:], item)