2015-07-07 2 views
-1

Допустим, у меня есть два списка списков, а я - палочка для создания из него различных перестановок. Посмотрите на эти два списка:Создайте подмножество возможных перестановок

l1 = [[0, 8], [4], [6, 7], [1], [3], [5], [2]] 
l2 = [[4, 8], [0], [6, 7], [3], [1], [5], [2]] 

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

(4, 3, 2, 1, 0, 5, 6, 7, 8) 
(8, 3, 2, 1, 0, 5, 7, 6, 4) 
(4, 3, 2, 1, 0, 5, 7, 6, 8) 
(8, 3, 2, 1, 0, 5, 6, 7, 4) 

Подумав об этом, у меня есть следующая идея. Я бы сгенерировал все четыре возможности l1 (будучи кортежем в конце) сделать l2 в кортеж, сделать словарь zip, заказать этот словарь и преобразовать эти четыре dicts в список кортежей. Звучит разумно?
Мне нелегко генерировать четыре кортежа. Это то, что у меня есть до сих пор.

l1 = [[0, 8], [4], [6, 7], [1], [3], [5], [2]] 
l2 = [[4, 8], [0], [6, 7], [3], [1], [5], [2]] 

out = [()] 
def get_permutations(lst): 
    for i in lst: 
     for perms in permutations(i): 
      out[0] = out[0] + perms 
    return out 

print(get_permutations(l1)) 

который печатает [(0, 8, 8, 0, 4, 6, 7, 7, 6, 1, 3, 5, 2)] Как сгенерировать другой кортеж, когда я получаю запись в моем списке, где более чем одна перестановка этой записи списка можно?

Я также знаю, что print(list(itertools.product(*l1))) делает почти то, что хочу, но не совсем. Он дает [(0, 4, 6, 1, 3, 5, 2), (0, 4, 7, 1, 3, 5, 2), (8, 4, 6, 1, 3, 5, 2), (8, 4, 7, 1, 3, 5, 2)]. Возможно, есть способ изменить это.

Это не вопрос домашней работы.
Чтобы обеспечить контекст: я создаю программу для проверки изоморфизма графа. Списки - это цветовые классы узлов. С этими классами цветов я хочу ограничить все возможные перестановки графика только несколькими, чтобы сделать грубую силу быстрее.

+0

Это звучит как домашнее задание вопрос –

+0

Представьте, что вы делали до сих пор – The6thSense

+0

Это википедии статья, безусловно, поможет математической точки зрения! https://en.wikipedia.org/wiki/Cyclic_permutation – Hrvoje

ответ

Смежные вопросы