У меня есть список списков ([[a,b,c],[d,e,f],[g,h,i]...]).
Я пытаюсь сгенерировать все возможные списки, которые достижимы из этого состояния, сделав N свопов в текущем состоянии, меняя элемент из списка однимиз другого списка.
Так, например, - поменять местами a с d, b с e и f с g (обратите внимание, что мы ищем N перестановок, которые возможны из ЭТОГО состояния)
ОднакоЯ не хочу выполнять фактический обмен, а скорее сгенерировать список инструкций для обмена, который также будет включать индекс sublist
.
. Таким образом, пример вывода с N = 3 будет:
((1: a, 2: d), (1: b, 2: e), (1: c, 2: f))
(имеется в виду замена a с l1
на d с l2
, замена b на l1
на e с l2
, замена c на l1
на f с l2
)
((1: a, 2: e), (1: b, 2: d), (1: c, 2: f))
((1: a, 3: g), (1: b, 3: h), (1: c, 3: i))
etc..
Тем не менее, большая проблема заключается в том, что первая инструкция подкачки и вторая приведут к в одном и том же списке , и я не уверен, как определить иэффективно устранять такие случаи.
Прямо сейчас я использую довольно глупый повторфункция Sive, которая не различает, был ли уже выполнен обмен или нет. Вот код:
def swap(list, num_of_swaps, current_swap, swap_instructions = []):
for l1 in range(0,len(list)):
for l2 in range(l1+1,len(list)):
for e1 in list[l1]:
for e2 in list[l2]:
swap_instructions.append({l1:{'add': e2, 'remove': e1},
l2:{'add': e1, 'remove':e2}})
if current_round < max_repetitions:
swap(list, num_of_swaps, current_round+1, swap_instructions)
success = swap_and_do_checks(list, swap_instructions)
if success:
return swap_instructions
del swap_instructions[-1]
return []
Я не уверен, как избежать повторения, если это не слишком дорого.
Буду признателен за вашу помощь.
Спасибо