2014-06-21 1 views
0
from itertools import combinations 
a = [1,2,3] 
combinations(a,2) #will give me ((1,2),(1,3),(2,3)) 
combinations(a,3) #will give me ((1,2,3),) 

그러나 배열 길이가 다른 결과를 원하면 예를 들어.itertools-Python을 사용하여 최소 길이가 N 인 요소 조합을 찾는 방법

내가 그렇게 될 수 있어야 2 보다 더 많거나 동일한 길이의 지정된 배열 [1,2,3]의 모든 조합을 찾으려면 ((1,2),(1,3),(2,3),(1,2,3)) 내가 람다하지만하지 사용하려고 c = combinations(a,>=2) 같은

c = combinations(a,lambda x: x for x in [2,3])

작업

뿐만 아니라 내가 아는 포괄적 인 c = combinations(a,[x for x in [2,3]])

목록 간단한 루프를 사용하여 diff 길이의 조합을 찾을 수 있습니다.

for l in [2,3]: 
    combinations(a,l) 

하지만이 작업을 수행 할 파이썬 방법이 있습니까?

답변

3

당신은 combinationschain.from_iterable을 결합 할 수 있습니다 :

여기
>>> from itertools import chain, combinations 
>>> a = [1,2,3] 
>>> n = 2 
>>> cc = chain.from_iterable(combinations(a, i) for i in range(n, len(a)+1)) 
>>> list(cc) 
[(1, 2), (1, 3), (2, 3), (1, 2, 3)] 

chain.from_iterable 발전기 표현 (combinations(a, i) for i in range(n, len(a)+1)) 생산되는 것을 평평하게한다. 그렇지 않다면 당신이 찾고 있던 형식이 아니지만 괜찮은 편이다.

>>> [list(combinations(a,i)) for i in range(n, len(a)+1)] 
[[(1, 2), (1, 3), (2, 3)], [(1, 2, 3)]] 

+0

이것은 아주 멋지게 넣었습니다. – Nobi

+1

이것은 정확하게 [powerset' recipe] (https://docs.python.org/2/library/itertools.html#recipes)도 사용합니다. – jonrsharpe