2014-04-14 2 views
19
우리는 두 개의리스트, A와 B가

:두 목록간에 모든 매핑을 얻는 방법은 무엇입니까?

A = ['a','b','c'] 
B = [1, 2] 

는 A와^n은 2가 포함 된 B 사이의 모든지도의 집합을 구축하는 파이썬 방법이 있나요 (여기에 2^3 = 8)? 즉 :

import itertools as it 
P = it.product(A, B) 
[p for p in P] 

제공 : itertools.product를 사용

[(a,1), (b,1), (c,1)] 
[(a,1), (b,1), (c,2)] 
[(a,1), (b,2), (c,1)] 
[(a,1), (b,2), (c,2)] 
[(a,2), (b,1), (c,1)] 
[(a,2), (b,1), (c,2)] 
[(a,2), (b,2), (c,1)] 
[(a,2), (b,2), (c,2)] 

, 모든 튜플을 얻을 수있어

Out[3]: [('a', 1), ('a', 2), ('b', 1), ('b', 2), ('c', 1), ('c', 2)] 

답변

23

당신은 itertools.productzip

from itertools import product 
print [zip(A, item) for item in product(B, repeat=len(A))] 
하여이 작업을 수행 할 수 있습니다

출력

[[('a', 1), ('b', 1), ('c', 1)], 
[('a', 1), ('b', 1), ('c', 2)], 
[('a', 1), ('b', 2), ('c', 1)], 
[('a', 1), ('b', 2), ('c', 2)], 
[('a', 2), ('b', 1), ('c', 1)], 
[('a', 2), ('b', 1), ('c', 2)], 
[('a', 2), ('b', 2), ('c', 1)], 
[('a', 2), ('b', 2), ('c', 2)]] 

product(B, repeat=len(A))

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

그런 다음 우리가 제품에서 각 요소를 선택하고 원하는 출력을 얻기 위해, A 그것을 압축 생산하고 있습니다.

11
import itertools as it 

A = ['a','b','c'] 
B = [1, 2] 

for i in it.product(*([B]*len(A))): 
    print(list(zip(A, i))) 

출력 :

[('a', 1), ('b', 1), ('c', 1)] 
[('a', 1), ('b', 1), ('c', 2)] 
[('a', 1), ('b', 2), ('c', 1)] 
[('a', 1), ('b', 2), ('c', 2)] 
[('a', 2), ('b', 1), ('c', 1)] 
[('a', 2), ('b', 1), ('c', 2)] 
[('a', 2), ('b', 2), ('c', 1)] 
[('a', 2), ('b', 2), ('c', 2)] 

그것이 여러 파이썬 고유의 언어 기능을 사용하기 때문에, it.product(*([B]*len(A))) 보면 그것이 매우 파이썬 있는지 확실하지. 그러나 실제로는 파이썬 적이기에는 너무 비밀 스럽습니다 ... B는 A의 길이에 따라 n 번 반복되고 제품 기능에 압축 해제됩니다.

관련 문제