준호씨의 블로그

python - 리스트에서 두개쌍 조합(combinations) 구하기. 짝조합 본문

개발이야기

python - 리스트에서 두개쌍 조합(combinations) 구하기. 짝조합

준호씨 2020. 5. 24. 17:03
반응형

리스트에서 두 개 쌍의 모든 조합(Combinations)을 구하려면 어떻게 해야 할까요?

1,2,3이라는 숫자 리스트가 있다고 가정했을 때 두 개 쌍의 조합은 (1, 2), (1, 3), (2, 3) 3가지가 있습니다. 수학 용어로 표현하면 nCr인데 n은 3(1,2,3의 개수)이고 r은 2(2개씩)입니다.

6개의 숫자를 갖고 있는 리스트에서 2개씩 뽑는 조합을 구해보겠습니다.

[1,2,3,4,5,6] 리스트로 두 숫자의 모든 조합을 구하면 아래와 같습니다.

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

첫 번째 숫자를 기준으로 2,3,4,5,6번째 숫자와 조합을 만들고, 두 번째 숫자를 기준으로 3,4,5,6번째 숫자와 조합을 만드는 것을 반복합니다.

1 - 2,3,4,5,6

2 - 3,4,5,6

3 - 4,5,6

4 - 5,6

5 - 6

이런 식으로 짝을 맞출 수 있습니다.

알고리즘으로 구현하여 함수를 구현해 보았습니다.

def comb2(arr):
    result = []
    for i in range(len(arr)):
        for j in arr[i + 1:]:
            result.append((arr[i], j))
    return result

 

arr = [1,2,3,4,5,6]
print(comb2(arr))

의 결과는

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

으로 잘 나옵니다.

 

하지만 python에는 조합을 쉽게 구할 수 있는 유틸리티 함수를 제공합니다.

from itertools import combinations

print(list(combinations(arr, 2)))

결과는 앞서 구현한 것과 똑같이 나옵니다.

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

 

개수를 구하는 방법은 len함수를 이용하면 됩니다.

>>> print(len(list(combinations(arr, 2))))
15

수학 공식으로 계산하면 6C2는 6!/2!(6-2)!=15

 

 

숫자 2개 쌍의 조합 외에 3개 4개 그 이상의 조합도 구할 수 있습니다.

3개 숫자의 조합을 구하는 방법과 결과입니다.

print(list(combinations(arr, 3)))

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

 

반응형
Comments