1. 순열
몇 개를 골라 순서를 고려해 나열한 경우의 수를 의미합니다.
서로 다른 n개에서 r개를 꺼내서 순서를 정해 나열하는 가짓수입니다. 영어로는 permutation이라고 하며 nPr이라고 표시합니다.
파이썬에서 순열을 사용하기 위해서는 라이브러리 추가를 해주어야 합니다.
from itertools import permutations
알파벳 4개가 들어간 리스트 arr에서 2개를 순서를 고려하여 뽑는 경우
from itertools import permutations
arr = [ 'A', 'B', 'C', 'D' ]
nPr = permutations(arr, 2)
print(list(nPr))
결과)
[('A', 'B'), ('A', 'C'), ('A', 'D'),
('B', 'A'), ('B', 'C'), ('B', 'D'),
('C', 'A'), ('C', 'B'), ('C', 'D'),
('D', 'A'), ('D', 'B'), ('D', 'C')]
('A', 'B')와 ('B', 'A')는 순서를 고려하기 떄문에 서로 다른 경우입니다.
반복문에도 응용할 수 있습니다.
from itertools import permutations
arr = [ 'A', 'B', 'C', 'D' ]
for x, y in permutations(arr, 2):
print((x, y))
결과)
('A', 'B')
('A', 'C')
('A', 'D')
('B', 'A')
('B', 'C')
('B', 'D')
('C', 'A')
('C', 'B')
('C', 'D')
('D', 'A')
('D', 'B')
('D', 'C')
반복문으로 arr에서 2개씩 뽑아 순열로 가짓수를 표현했습니다.
- 반복문에 permutations(arr)라고 쓰면 숫자 매개변수를 넣지 않기 때문에 len(arr)로 인식되어 4개의 조합을 보여줍니다.
2. 조합
몇개를 골라 순서를 고려하지 않고 나열한 경우의 수를 의미합니다.
서로 다른 n개 중에서 r개를 취하여 조를 만들때 이 하나하나의 조를 n개 중에서 r개 취한 조합이라고 합니다.
영어로 combination이라고 하며 nCr이라고 표현합니다.
파이썬으로 조합을 사용하기 위해서는 라이브러리를 추가해 주어야 합니다.
from itertools import combinations
알파벳 4개가 들어간 배열에서 순서를 고려하지 않고 2개를 뽑는 경우
from itertools import combinations
arr = [ 'A', 'B', 'C', 'D' ]
nCr = combinations(arr, 2)
print(list(nCr))
결과)
[('A', 'B'), ('A', 'C'), ('A', 'D'), ('B', 'C'), ('B', 'D'), ('C', 'D')]
('A', 'B')와 ('B', 'A')는 순서를 고려하기 떄문에 서로 같은 경우입니다. 그래서 중복되지 않고 한번만 출력됩니다.
조합도 마찬가지로 반복문에 응용할 수 있습니다.
from itertools import combinations
arr = [ 'A', 'B', 'C', 'D' ]
for x, y in combinations(arr, 2):
print((x, y))
결과)
('A', 'B')
('A', 'C')
('A', 'D')
('B', 'C')
('B', 'D')
('C', 'D')
반복문으로 순서를 고려하지 않고 arr의 원소 2개를 뽑아 표현했습니다.
3. 데카르트 곱
두 개 이상 리스트의 모든 조합을 보여줍니다.
from itertools import product
arr = [ 'ABC', '123', '!@#' ]
tmp = list(product(*arr))
print(tmp)
결과)
[('A', '1', '!'), ('A', '1', '@'), ('A', '1', '#'), ('A', '2', '!'), ('A', '2', '@'),
('A', '2', '#'), ('A', '3', '!'), ('A', '3', '@'), ('A', '3', '#'), ('B', '1', '!'),
('B', '1', '@'), ('B', '1', '#'), ('B', '2', '!'), ('B', '2', '@'), ('B', '2', '#'),
('B', '3', '!'), ('B', '3', '@'), ('B', '3', '#'), ('C', '1', '!'), ('C', '1', '@'),
('C', '1', '#'), ('C', '2', '!'), ('C', '2', '@'), ('C', '2', '#'), ('C', '3', '!'),
('C', '3', '@'), ('C', '3', '#')]
arr에 있는 리스트 하나하나 모든 조합을 보여줍니다.
순서대로 'ABC'의 A와 '123'의 1 '!@#'의 !를 조합한 A1!이 가장 먼저 나오고 그 다음으로 A1@이 나오면서 C3#을 마지막으로 모든 조합을 보여줍니다.
'[Python]' 카테고리의 다른 글
[Python] 파이썬 remove(), pop(), del 차이점 (0) | 2022.07.27 |
---|---|
[Python] 파이썬 heap 자료구조, heapq 모듈 사용 (0) | 2022.07.25 |
[Python] f-string을 이용한 문자열 포메팅 (0) | 2022.07.22 |
[Python] 문자열 루프, enumerate함수 (0) | 2022.07.19 |
[Python] .reverse()함수와 reversed()함수의 차이 (0) | 2022.07.18 |