Хорошо, это полный код, с которым я работаю. Теперь я обеспечил ввод и вывод. Надеюсь, это имеет больше смысла, что мои абсурдные вопросы раньше .....
def get_positions(xs, item):
if isinstance(xs, list):
for i, it in enumerate(xs):
for pos in get_positions(it, item):
yield (i,) + pos
elif xs == item:
yield ()
blocks = [-12,-10,-8,-6,-4,-2,0,2,4,6,8,10,12,14,16]
startcombos = [[-12], [-12, -10], [-12, -10, -8], [-12, -10, -8, -6], [-12, -10, -8, -6, -4], [-12, -10,-8, -6, -4, -2], [-12, -10, -8, -6, -4, -2, 0], [-12, -10, -8, -6, -4, -2, 0, 2], [-12, -10, -8, -6, -4, -2, 0, 2, 4], [-12, -10, -8, -6, -4, -2, 0, 2, 4, 6], [-12, -10, -8, -6, -4, -2, 0, 2, 4, 6, 8], [-12, -10, -8, -6, -4, -2, 0, 2, 4, 6, 8, 10], [-12, -10, -8, -6, -4, -2, 0, 2, 4, 6, 8, 10, 12], [-12, -10, -8, -6, -4, -2, 0, 2, 4, 6, 8, 10, 12, 14], [-12, -10, -8, -6, -4, -2, 0, 2, 4, 6, 8, 10, 12, 14, 16]]
combos = [[-10], [-10, -8], [-10, -8, -6], [-10, -8, -6, -4], [-10, -8, -6, -4, -2], [-10, -8, -6,-4, -2, 0], [-10, -8, -6, -4, -2, 0, 2], [-10, -8, -6, -4, -2, 0, 2, 4], [-10, -8, -6, -4, -2, 0, 2, 4, 6], [-10, -8, -6, -4, -2, 0, 2, 4, 6, 8], [-10, -8, -6, -4, -2, 0, 2, 4, 6,8, 10], [-10, -8, -6, -4, -2, 0, 2, 4, 6, 8, 10, 12], [-10, -8, -6, -4, -2, 0, 2, 4, 6, 8, 10, 12, 14], [-10, -8, -6, -4, -2, 0, 2, 4, 6, 8, 10, 12, 14, 16], [-8], [-8, -6], [-8, -6, -4], [-8, -6, -4, -2], [-8, -6, -4, -2, 0], [-8, -6, -4, -2, 0, 2], [-8, -6, -4, -2, 0, 2, 4], [-8, -6, -4, -2, 0, 2, 4, 6], [-8, -6, -4, -2, 0, 2, 4, 6, 8], [-8, -6, -4, -2, 0, 2, 4, 6, 8, 10], [-8, -6, -4, -2, 0, 2, 4, 6, 8, 10, 12], [-8, -6, -4, -2, 0, 2, 4, 6, 8, 10, 12, 14], [-8, -6, -4, -2, 0, 2, 4, 6, 8, 10, 12, 14, 16], [-6], [-6, -4], [-6, -4, -2], [-6, -4, -2, 0], [-6, -4, -2, 0, 2], [-6, -4, -2, 0, 2, 4], [-6, -4, -2, 0, 2, 4, 6], [-6, -4, -2, 0, 2, 4, 6, 8], [-6, -4, -2, 0, 2, 4, 6, 8, 10], [-6, -4, -2, 0, 2, 4, 6, 8, 10, 12], [-6, -4, -2, 0, 2, 4, 6, 8, 10, 12, 14], [-6, -4, -2, 0, 2, 4, 6, 8, 10, 12, 14, 16], [-4], [-4, -2], [-4, -2, 0], [-4, -2, 0, 2], [-4, -2, 0, 2, 4], [-4, -2, 0, 2, 4, 6],[-4, -2, 0, 2, 4, 6, 8], [-4, -2, 0, 2, 4, 6, 8, 10], [-4, -2, 0, 2, 4, 6, 8, 10, 12], [-4, -2, 0, 2, 4, 6, 8, 10, 12, 14], [-4, -2, 0, 2, 4, 6, 8, 10, 12, 14, 16], [-2], [-2, 0],[-2, 0, 2], [-2, 0, 2, 4], [-2, 0, 2, 4, 6], [-2, 0, 2, 4, 6, 8], [-2, 0, 2, 4, 6, 8, 10], [-2, 0, 2, 4, 6, 8, 10, 12], [-2, 0, 2, 4, 6, 8, 10, 12, 14], [-2, 0, 2, 4, 6, 8, 10, 12, 14, 16], [0], [0, 2], [0, 2, 4], [0, 2, 4, 6], [0, 2, 4, 6, 8], [0, 2, 4, 6, 8, 10], [0,2, 4, 6, 8, 10, 12], [0, 2, 4, 6, 8, 10, 12, 14], [0, 2, 4, 6, 8, 10, 12, 14, 16], [2], [2, 4], [2, 4, 6], [2, 4, 6, 8], [2, 4, 6, 8, 10], [2, 4, 6, 8, 10, 12], [2, 4, 6, 8, 10, 12, 14], [2, 4, 6, 8, 10, 12, 14, 16], [4], [4, 6], [4, 6, 8], [4, 6, 8, 10], [4, 6, 8, 10,12], [4, 6, 8, 10, 12, 14], [4, 6, 8, 10, 12, 14, 16], [6], [6, 8], [6, 8, 10], [6, 8, 10, 12], [6, 8, 10, 12, 14], [6, 8, 10, 12, 14, 16], [8], [8, 10], [8, 10, 12], [8, 10, 12, 14], [8, 10, 12, 14, 16], [10], [10, 12], [10, 12, 14], [10, 12, 14, 16], [12], [12, 14], [12, 14, 16], [14], [14, 16], [16]]
temp = []
for i in range(len(startcombos)):
for j in list(get_positions(combos,startcombos[i][-1]+2)):
if j[-1]==0 and combos[j[0]][-1]!=blocks[-1]:
for k in list(get_positions(combos,combos[j[0]][-1]+2)):
if k[-1]==0 and combos[k[0]][-1]!=blocks[-1]:
for l in list(get_positions(combos,combos[k[0]][-1]+2)):
if l[-1]==0 and combos[l[0]][-1]==blocks[-1]:
temp.append(tuple(startcombos[i]))
temp.append(tuple(combos[j[0]]))
temp.append(tuple(combos[k[0]]))
temp.append(tuple(combos[l[0]]))
combinations.append(temp)
temp = []
Это код для генерации температуры длины 4. Если длина комбинаций увеличивается, я бы включил другое условие в больший цикл, как это
for i in range(len(startcombos)):
for j in list(get_positions(combos,startcombos[i][-1]+2)):
if j[-1]==0 and combos[j[0]][-1]!=blocks[-1]:
for k in list(get_positions(combos,combos[j[0]][-1]+2)):
if k[-1]==0 and combos[k[0]][-1]!=blocks[-1]:
for l in list(get_positions(combos,combos[k[0]][-1]+2)):
if l[-1]==0 and combos[l[0]][-1]!=blocks[-1]:
for m in list(get_positions(combos,combos[l[0]][-1]+2)):
if m[-1]==0 and combos[m[0]][-1]==blocks[-1]:
temp.append(tuple(startcombos[i]))
temp.append(tuple(combos[j[0]]))
temp.append(tuple(combos[k[0]]))
temp.append(tuple(combos[l[0]]))
temp.append(tuple(combos[m[0]]))
combinations.append(temp)
temp = []
Это создаст темп длиной 5. Как вы заметили, изменились первое и последнее условия и циклы, средняя часть осталась прежней. Как написать функцию или любой другой способ, которым я могу достичь ее с переменной длиной?
Теперь то, что я получил бы здесь, это, в основном, комбинации, которые получаются путем предоставления определенных условий. Я знаю, что я мог бы попробовать Python-комбинации из itertools, но генерировать все комбинации просто не стоит, если я хочу конкретные комбинации и, кроме того, вычислительное время также важно. Таким образом, это дало бы следующий вывод для длины 4
combinations[0] = [[-12],[-10],[-8],[-6,-4,-2,0,2,4,6,8,10,12,14,16]]
и т. Д., Число которых 364.
Для длины 5 он даст в общей сложности 1001 комбинацию, первой из которых будет эта
combinations[0] = [[-12],[-10],[-8],[-6],[-4,-2,0,2,4,6,8,10,12,14,16]]