2017-04-16 7 views
1

조합에 기초한 질문을하고 있습니다. 그리고 저는 파이썬으로 그렇게 좋지 않습니다.Python itertools 조합 맞춤 설정

ncr을 사용하는 itertools 조합 함수는 n에서 가능한 조합을 반환합니다. 내가 선택한 r 가능한 조합을 반환합니다 무언가를 원하고 그 반복에서 선택되지 않은 n 개의 숫자에서 다른 나머지 요소.

예 : [2, 4] 선택할 때

>>>from itertools import combinations 
>>>list = [1, 2, 3, 4, 5] 
>>>rslt = combinations(list, 2) 

그것도 [1, 3, 5]는 그래서 미리 [[2, 4], [1, 3, 5]]

감사 같이 돌려 돌려

답변

1

itertools.combinations

퇴역 입력의 iterable로부터 요소의 urn r 길이 서브 시퀸스.

당신은 다른 항목 [j for j in l if j not in i] 얻을 수있는 지능형리스트를 사용할 수 있습니다

from itertools import combinations 

l = [1, 2, 3, 4, 5] 

for i in combinations(l,2): 
    print(list(i),[j for j in l if j not in i]) 

을 그리고 당신은 얻을 것이다 : 그런데

[1, 2] [3, 4, 5] 
[1, 3] [2, 4, 5] 
[1, 4] [2, 3, 5] 
[1, 5] [2, 3, 4] 
[2, 3] [1, 4, 5] 
[2, 4] [1, 3, 5] 
[2, 5] [1, 3, 4] 
[3, 4] [1, 2, 5] 
[3, 5] [1, 2, 4] 
[4, 5] [1, 2, 3] 

, 사용하지 않는 것이 좋습니다 list을 변수 이름으로 사용하십시오.

+0

한 줄로 된 목록으로 이해할 수 있습니까? – Arman

+1

@ (조합 (i, 2)에서 i에 대해 @Arman'[(목록 (i), j는 i가 j 인 경우 j)] – McGrady

+0

감사합니다. 변수 이름으로 사용하지 마십시오. – minhaj

1

가장 간단한 방법은 조합에있는 요소를 제거, 원래 목록의 복사본을하는 것입니다 :

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

합니다 (조합 튜플을 반환

from itertools import combinations 
def combinations_and_remaining(l, n): 
    for c in combinations(l, n): 
     diff = [i for i in l if i not in c] 
     yield c, diff 

for i in combinations_and_remaining([1, 2, 3, 4, 5], 2): 
    print(i) 

윌 출력을, 나머지 요소는 효율성을위한 목록으로 반환 됨)

0

다소 과장하지만 재미있는 방법은 을 두 번 사용하는 것입니다.

from itertools import combinations 
n = 5 
k = 2 
lst = list(range(1, n+1)) 
rslt = zip(combinations(lst, k), map(tuple, reversed(list(combinations(lst, n-k))))) 
print(list(rslt)) 
# -> [((1, 2), (3, 4, 5)), ((1, 3), (2, 4, 5)), ((1, 4), (2, 3, 5)), 
#  ((1, 5), (2, 3, 4)), ((2, 3), (1, 4, 5)), ((2, 4), (1, 3, 5)), 
#  ((2, 5), (1, 3, 4)), ((3, 4), (1, 2, 5)), ((3, 5), (1, 2, 4)), 
#  ((4, 5), (1, 2, 3))]