2012-12-16 2 views
2

나는 목록을 나는 각 목록 (A, B 및 C)의 모든 순열을 생성 할 필요가 리스트의 DICT의 모든 순열 (특정 순서) 생성 조합

d = {'A': [1,2,3], 'B': [4,5], 'C': [6]} 

의 DICT 있습니다. 괜찮습니다. p

{'A': [(1, 2, 3), (1, 3, 2), (2, 1, 3), (2, 3, 1), (3, 1, 2), (3, 2, 1)], 
'B': [(4, 5), (5, 4)], 
'C': [(6,)]} 

p = {} 
for k in d.keys(): 
    p[k] = [i for i in itertools.permutations(d[k])] 

이 결과 그럼 (실제로 ['A', 'B', 'C'] 제공 sorted(p.keys()) 순서 예) A, B 및 C 목록에서 있지만 특정 순서 튜플을 병합 할 필요가있다. 그래서 정수 튜플의 목록을 확보해야합니다

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

내가 itertools.product이 이러한 경우에 사용될 수 있다는 것을 알고 있지만, 초기 사전 d는 다른 키와 값의 임의의 숫자로 구성 될 수 있습니다 나는 방법을 모른다 이 경우에 사용하십시오. 또는 아마도 당신은 desribed 문제의 완전히 다른 해결책을 제안 할 수있을 것입니다. 최종 솔루션의 속도가 빨라집니다. 이 같은

답변

5

뭔가 :

from itertools import permutations, product, chain 

d = {'A': [1,2,3], 'B': [4,5], 'C': [6]} 
# You don't need to materialise permutations here, but this matches your existing dict 
p = {k:list(permutations(v)) for k, v in d.iteritems()}  

for blah in product(*map(p.get, sorted(p))): 
    print list(chain.from_iterable(blah)) # or use tuple instead of list 

[1, 2, 3, 4, 5, 6] 
[1, 2, 3, 5, 4, 6] 
[1, 3, 2, 4, 5, 6] 
[1, 3, 2, 5, 4, 6] 
[2, 1, 3, 4, 5, 6] 
[2, 1, 3, 5, 4, 6] 
[2, 3, 1, 4, 5, 6] 
[2, 3, 1, 5, 4, 6] 
[3, 1, 2, 4, 5, 6] 
[3, 1, 2, 5, 4, 6] 
[3, 2, 1, 4, 5, 6] 
[3, 2, 1, 5, 4, 6] 
+0

신난다 !! 나는 대답을 꺼리는 것을 시도한다. 1)'map (p.get, sorted (p))'는 주어진 순서로리스트를 반환하지만'*'는 무엇을 의미합니까? 2) 순열 (permutations)을 실현하지 않으려면 어떻게해야합니까? – DrDom

+0

'''''''''''''''''''''''''''''' '' '언팩하고 있기 때문에'product (* some_list)'가'product (some_list [0], some_list [1], some_list [2] ... 2) dict-comp의 순열 앞에'list'를 넣지 마십시오. –