2014-12-08 2 views
4

Скажем, у меня был список: [1,2,3]Создать все перестановки списка и перестановки возможных списков в этом списке?

Как бы я произвожу:

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

Я знаю, как использовать itertools.permutations(), но я не знаю, как произвести эту часть [1],[2],[3],[1,2],[1,3],[2,3] из список.

Спасибо!

+4

Вы намеренно исключая перестановки, такие как [2,1 ], [3,1], [3,2]? – mhawke

ответ

2

Ваш ожидаемый результат не содержит всех возможных перестановок, поэтому не уверен, что это то, что вы хотите, или вы пропустили некоторые из них. Но, чтобы получить все возможные перестановки списка разной длины, вы можете сделать следующее:

from itertools import permutations 
a_list = [1,2,3] 
perm_list = [p for l in range(1, len(a_list)+1) for p in permutations(a_list,l)] 
print(perm_list) 

Результат:

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

Если список входных велик, хотя, возможно, было бы лучше использовать выражение генератора, например

perm_list_gen = (p for l in range(1, len(a_list)+1) for p in permutations(a_list,l)) 
print(perm_list_gen) 
#prints: <generator object <genexpr> at 0x7f176bbd88b8> 

И чем просто пойти по одному, а не все сразу:

for perm in perm_list_gen: 
    print(perm) 
0
from itertools import permutations 
lst = [1, 2, 3] 
per = list(permutations(lst, 1)) + list(permutations(lst, 2)) + list(permutations(lst, 3)) 

выход:

>>> [(1,), (2,), (3,), (1, 2), (1, 3), (2, 1), (2, 3), (3, 1), (3, 2), (1, 2, 3), (1, 3, 2), (2, 1, 3), (2, 3, 1), (3, 1, 2), (3, 2, 1)] 
Смежные вопросы