2014-05-20 2 views
-3

목록의 목록에서 모든 두 항목 조합을 찾고 싶습니다. 내부 목록에는 하나 이상의 항목이 포함되어 있으며 동일한 내부 목록에 항목 조합을 포함하지 않으려합니다 (단, 별도의 내부 목록에 해당 항목이없는 한).Python : 하나 이상의 항목을 포함하는 목록의 목록에서 두 항목 조합

itertools의 내장 함수를 사용하여 원하는 조합 요구 사항에 도달하는 방법이 있습니까? 아니면 처음부터 for 루프를 작성해야합니까?

여기 아주 간단한 예입니다 :

x = [['219'], ['220'], ['218']] 
# find combos 
print combos 
>> [['219', '220'], ['219', '218'], ['220', '218']] 

목록은 하나 개 이상의 항목 목록을 포함 할 수 있습니다. 내부 목록에 1 개 이상의 항목이 포함 된보다 복잡한 예제는 다음과 같습니다.

x = [['222', '219'], ['221'], ['220', '218', '216']] 
# find combos 
print combos 
>> [['222', '221'], ['222', '220'], ['222', '220'], ['222', '218'], ['222', '216'], ['219', '221'], ['219', '220'], ['219', '218'], ['219', '216'], ['221', '220'], ['221', '218'], ['221', '216']] 
+0

좀 더 명확해야 내 원하는 조합의 요구 사항에 도달하기 위해 itertools에서 기능 내장을 활용하는 방법이, 또는 내가 루프에 대한를 작성해야 할 기스로부터. – Abundnce10

+0

질문을보다 간결하게 편집했습니다. – Abundnce10

답변

2

이 한 줄은 어떨까요?

from itertools import combinations, product, chain 

x = [['222', '219'], ['221'], ['220', '218', '216']] 
combos = list(chain.from_iterable([list(product(a,b)) for (a,b) in combinations(x,2)])) 

편집 : roippi 절대적으로 올바른 것입니다. 우리는

불필요한 중간체 제거 할 수
combos = list(chain.from_iterable(product(*c) for c in combinations(x,2))) 
+3

이것은 절대적으로 올바른 접근이지만 불필요하게 중간 목록을 많이 작성하고 있습니다. 'list (chain.from_iterable (product (* c) for c (x, 2)))) – roippi

+0

감사합니다 roippi, 그게 내가 원하는거야! – Abundnce10