2017-02-17 8 views
0

n = n1 + n2 + n3에 대해 n 개의 원소 [0,1,2, ...]에 대한 순열리스트를 갖고 싶습니다. 그러나 이러한 순열은 m 개의 파티션으로 분할됩니다. 내가 할파이썬에서 분할 된 순열

product(permutations([0,1,2]),permutations([3,4])) 

을 : 나는 itertools를 사용하는 경우

0,1,2 | 3,4 
0,1,2 | 4,3 
0,2,1 | 3,4 
0,2,1 | 4,3 
... 
2,1,0 | 4,3 

을 : N1 예를 들어

, 3,2 = N2 나는 것

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

그러나 나는 것 like :

[(0, 1, 2, 3, 4), (0, 1, 2, 4, 3), ...] 
내가 얻을 것 후자의 경우

input = [3,2] 
or 
input = [4,3,2] 

:

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

모든 아이디어를 입력 단순히 파티션의 길이 될 수 있다면

는 또한 그것은 좋은 것?

답변

0

문제점을 이해 했으므로 다음 코드가 필요합니다.

from itertools import permutations, product 


def part_perm_iter(ns): 
    inds = [int(sum(ns[:i])) for i in xrange(len(ns)+1)] 
    pair_inds = zip(inds,inds[1:]) 

    for p in product(*[permutations(xrange(a,b)) for a, b in pair_inds ]): 
     yield sum(p,()) 

예를 들어, print list(part_perm_iter([2,2])) 인쇄 것이다

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

하지 OK : 리스트 (part_permutations_iter ([2,1])) [(0, 1, 2), (반환해야 1, 0, 2)] – user18097

+0

그럼 당신의 문제를 이해하지 못합니다. [(0, 1, 2), [(1,0,2)]은 유효한 구문이 아닙니다. 분명히 해줄 수 있니? – eguaio

+0

나는 당신이 지금 필요한 것을 이해했다고 생각합니다. – eguaio