2014-11-07 4 views
0

Предположим, у меня есть кортеж (3, 2, 1, 4). Я хотел бы найти все возможные комбинации, которые включают в себя 3 элемента из диапазона (5), 2 элемента из диапазона (5), 1 элемент из диапазона (5), а затем 4 элемента из диапазона (5). Порядок между каждой отдельной комбинацией имеет значение, поэтому я не могу просто использовать комбинации длины 9 из диапазона (5) или что-то в этом роде.Как я могу использовать несколько комбинаций разных длин из одного и того же списка в python?

В случае, что я написал выше, не было ясно, сочетание образец может быть

[0, 1, 4, 2, 3, 2, 0, 1, 2, 3]. 

Я ввел интервал в списке выше всего, чтобы понять, что упорядочение между ними имеет значение.

Я предполагаю, что это должно быть простым в использовании с itertools, но я просто не знаю, как это сделать.

+0

ли в subselections нужно заказывать (таким образом, чтобы образец мог начать '[0, 1, 4]' но не '[0, 4, 1]')? – DSM

+0

@DSM Нет, порядок в подзапросах не имеет значения. –

+1

Возможно, я не спросил об этом. Вам нужны варианты вашего примера, начиная с '[0,4,1]', чтобы отображаться на выходе или нет? – DSM

ответ

2

Предполагая, что вы ищете combinations, а не permutations, следующее должно делать то, что вы хотите.

from itertools import chain, combinations, product 

lengths = (3, 2, 1, 4) 
for L in product(*(combinations(range(5), length) for length in lengths)): 
    print(list(chain.from_iterable(L))) 
+0

+1 Черт! ты читаешь мои мысли. –

+0

Довольно элегантный. Способ пойти. – bgusach

+0

К сожалению, я получил сообщение об ошибке, когда я попробовал свой код. В последней строке с «списком» была синтаксическая ошибка. Кроме того, что делает звезда в продукте? Изменить: это потому, что я использую Python 3, что у меня появилось сообщение об ошибке на последней строке. Я попробую еще раз. –

0

если заказ очень важен для вас это даст вам то, что вы хотите:

>>> l1=list(combinations(range(5), 1)) 
>>> l2=list(combinations(range(5), 2)) 
>>> l3=list(combinations(range(5), 3)) 
>>> l4=list(combinations(range(5), 4)) 

>>> tl=[l3,l2,l1,l4] 
>>> list(product(*tl)) 

[((0, 1, 2), (0, 1), (0,), (0, 1, 2, 3)), ((0, 1, 2), (0, 1), (0,), (0, 1, 2, 4)), ((0, 1, 2), (0, 1), (0,), (0, 1, 3, 4)), ((0, 1, 2), (0, 1), (0,), (0, 2, 3, 4)), ((0, 1, 2), (0, 1), (0,), (1, 2, 3, 4)), ((0, 1, 2), (0, 1), (1,), (0, 1, 2, 3)), ((0, 1, 2), (0, 1), (1,), (0, 1, 2, 4)), ((0, 1, 2), (0, 1), (1,), (0, 1, 3, 4)), ((0, 1, 2), (0, 1), (1,), (0, 2, 3, 4)), ((0, 1, 2), (0, 1), (1,), (1, 2, 3, 4)), ((0, 1, 2), (0, 1), (2,), (0, 1, 2, 3)), ((0, 1, 2), (0, 1), (2,), (0, 1, 2, 4)), ((0, 1, 2), (0, 1), (2,), (0, 1, 3, 4)), ((0, 1, 2), (0, 1), (2,), (0, 2, 3, 4)), ((0, 1, 2), (0, 1), (2,), (1, 2, 3, 4)), ((0, 1, 2), (0, 1), (3,), (0, 1, 2, 3)), ((0, 1, 2), (0, 1), (3,), (0, 1, 2, 4)), ((0, 1, 2), (0, 1), (3,), (0, 1, 3, 4)), ((0, 1, 2), (0, 1), (3,), (0, 2, 3, 4)), ((0, 1, 2), (0, 1), (3,), (1, 2, 3, 4)), ((0, 1, 2), (0, 1), (4,), (0, 1, 2, 3)), ((0, 1, 2), (0, 1), (4,), (0, 1, 2, 4)), ((0, 1, 2), (0, 1), (4,), (0, 1, 3, 4)), ((0, 1, 2), (0, 1), (4,), (0, 2, 3, 4)), ((0, 1, 2), (0, 1), (4,), (1, 2, 3, 4)), ((0, 1, 2) 
Смежные вопросы