Notice
Recent Posts
Recent Comments
준호씨의 블로그
python - 리스트에서 두개쌍 조합(combinations) 구하기. 짝조합 본문
반응형
리스트에서 두 개 쌍의 모든 조합(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)]
반응형
'개발이야기' 카테고리의 다른 글
Spring Framework 공부 다시시작 (0) | 2020.06.17 |
---|---|
gcc -o main.c main.c (0) | 2020.05.27 |
git repository 복제하기. fork 아님. mirror (0) | 2020.05.19 |
AsciiDoc과의 조우. MarkDown이랑 뭐가 달라? (0) | 2020.05.18 |
centos - tmux 빌드해서 설치하기 (0) | 2020.05.13 |
Comments