Переставить все возможности для N списков с длиной M среднего массива - PullRequest
0 голосов
/ 24 июня 2019

Я пытаюсь вырезать некоторые файлы. Для этого я бы хотел переставить все возможные варианты. Есть 3 возможных начала, 40 возможных средних блоков и 3 возможных окончания.

Проблема в том, что мы не знаем, какой длины средний блок. Это может быть 1 блок длиной, но также 40 блоков длиной. Единственное, что мы знаем наверняка, это то, что блоки появляются последовательно, поскольку это PNG, который я пытаюсь восстановить.

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

s= [[headersList],[idatList],[iendList]]
    print(list(itertools.product(*s)))

Я ожидаю, что результат будет примерно таким,

[1, [1], 1]
[1, [1,2] , 1]
[1, [1,2,3], 1]
...
[2, [1] ,1]
[2, [1, 2], 1]

И так далее. Единственным условием является то, что начальный и конечный блоки должны находиться в соответствующем начале и конце массива. Средние блоки должны быть размером от 1 до 40 в последовательном порядке.

1 Ответ

1 голос
/ 24 июня 2019

Вот как вы должны использовать продукт:

from itertools import product

head   = range(1,4)
tail   = range(1,4)
middle = range(1,41)
combos = [(h,list(range(1,m+1)),t) for t,h,m in product(tail,head,middle)]


print(combos)
# [(1, [1], 1), (1, [1, 2], 1), (1, [1, 2, 3], 1), 
#  (1, [1, 2, 3, 4], 1), (1, [1, 2, 3, 4, 5], 1), ...
...