2015-07-25 2 views
-1

У меня есть сложная проблема с перестановкой, которую я нахожу очень сложной для кодирования.Перестановки в 2D-списках (Python)

Принесите меня, это может показаться немного уродливым.

У меня есть что-то этой формы:

L = [ [[(1, 2)], [(1, 2),(1, 3)]], [[(2, 3)]] ] 

Я хочу, чтобы вывести все «Перестановки», как это:

[ [(1,2),(2,3)], [(2,3),(1,2)], [(1,2),(1,3),(2,3)], [(2,3),(1,2),(1,3)] ] 

Наглядно, мне нужны все упорядоченности кортежей, содержащихся в списках (без повторения). Однако кортежи в одном списке не могут быть вместе. Например. Для [[(1, 2)], [(1, 2), (1, 3)]], (1,2) и (1,2), (1,3) находятся в одном списке. Таким образом, элемент на выходе не может быть (1,2) (1,3) (1,2).

Я некоторые грязный код, написанный, что делает работу, но будет требовать очистки на выходе:

output=[] 
for x in input: 
    for y in x: 
     a=[] 
     for x1 in input: 
      if x!=x1: 
       for y1 in x1: 
        a.append(list(permutations([y,y1],len([y,y1])))) 
     output.append(a) 

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

[[[(1, 2)], [(1, 2), (1, 3)]], [[(2, 3)]], [[(4,5),(6,7)]] 

Таким образом, элементы, как это будет incuded на выходе:

[(4,5),(6,7),(1,2),(2,3)] 

Кто-нибудь есть идеи, как я должен подходить к этому? Или какие-нибудь советы?

+0

Этот вопрос не совсем ясно для меня. Что вы подразумеваете под «перестановкой» и какой частью списка? Каково значение нескольких слоев вложенности в списке?Какой порядок должен содержать выход и как его следует сгруппировать? Могут ли списки быть вложенными на произвольные глубины? На данный момент я не могу понять, что задает этот вопрос, и я сомневаюсь, что кто-то еще может это сделать. –

+0

Согласен с Score_Under. Во второй части вопроса, похоже, вы просто пытаетесь получить все уникальные кортежи. – ate50eggs

+0

Я не понимаю проблему. Похоже, что есть базовые элементы, которые представляют собой списки из двух целых чисел, и, возможно, вам нужны все перестановки из них 1, 2 и 3 за один раз без повторения, но подсчет разных порядков. Способ сделать это - сначала создать список всех базовых элементов uniqe, а затем перечислить их перестановки в группах по 1, 2 и 3. Это легко сделать с помощью itertetools.permutations, поскольку он принимает аргумент, определяющий длину группы (называемый r f для длины кортежа). См. Https://docs.python.org/3/library/itertools.html#itertools.permutations. –

ответ

1

Я могу ошибаться, но от того, что я понимаю, что вы хотите сделать декартово произведение нескольких ансамблей (элемент которой сами ансамбли):

[[(1, 2)], [(1, 2), (1, 3)]] X [[(2, 3)]]

Затем для каждого элемента этого декартова произведения сделайте все перестановки элементов, содержащихся в этом примере, элементами декартово произведение являются:

([(1, 2)], [(2, 3)])

([(1, 2), (1, 3)], [ (2, 3)])

И, наконец, принять все перестановки каждого элемента:

перестановки первого элемента: ([(1, 2)], [(2, 3)]), ([ (2, 3)], [(1, 2)])

Перестановки второго элемента: ([(1, 2), (1, 3)], [(2, 3)]), ([ (2, 3)], [(1, 2), (1, 3)])

Если это то, что вы хотите, то вы можете сделать это с product и permutations от itertools модуля (также необходимо chain правильно перевернуть каждую перестановку в списке кортежей и получить точный результат муравей):

from itertools import product, permutations, chain 
L = [ [[(1, 2)], [(1, 2),(1, 3)]], [[(2, 3)]] ] 

for element in product(*L): 
    for permutation in permutations(element): 
     print(list(chain(*permutation))) 



[(1, 2), (2, 3)] 
[(2, 3), (1, 2)] 
[(1, 2), (1, 3), (2, 3)] 
[(2, 3), (1, 2), (1, 3)] 

Вы можете непосредственно получить список «перестановок» с списковых:

result = [list(chain(*permutation)) for element in product(*L) for permutation in permutations(element)] 
[[(1, 2), (2, 3)], 
[(2, 3), (1, 2)], 
[(1, 2), (1, 3), (2, 3)], 
[(2, 3), (1, 2), (1, 3)]] 
+0

Отличный ответ. Если это не решит проблему полностью, она должна по крайней мере дать мне хорошую отправную точку. Очень ценится. – Shoogiebaba

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