itertools
효율적인 루핑을 위한 이터레이터를 만드는 함수.
특정 패턴이 무한하게 반복되는 배열을 만들거나 배열의 값을 일괄적으로 계산하는 등의 작업을 할 수 있음.
그 중 조합형 이터레이터에 대해서만 알아볼 예정
1. 데카르트곱 구하기
from itertools import product
sample1 = ["A", "B", "C", "D", "E"]
sample2 = [1, 2, 3, 4]
# 행 / 열을 구분하여 프린트 하기 위해 enumerate 사용
for i, v in enumerate(product(sample1, sample2), 1):
print(v, end=" ")
if i % len(sample2) == 0:
print("")
# result output
"""
('A', 1) ('A', 2) ('A', 3) ('A', 4)
('B', 1) ('B', 2) ('B', 3) ('B', 4)
('C', 1) ('C', 2) ('C', 3) ('C', 4)
('D', 1) ('D', 2) ('D', 3) ('D', 4)
('E', 1) ('E', 2) ('E', 3) ('E', 4)
"""
itertools 를 사용하려면 모듈을 import 해줘야함.
여기서는 데카르트 곱을 만들기 위해 product 모듈을 import 했다.
product 안에 sample data 를 넣어주기만 하면 끝난다.
product(sample1, sample2)
나머지는 표 형태로 결과를 출력하기 위해 enumerate 등을 사용한거임.
2. 원소의 개수가 n개인 순열
from itertools import permutations
sample = ["A", "B", "C"]
# 원소의 개수가 3개인 순열 출력
for i in permutations(sample, 3):
print(i)
# result output
"""
('A', 'B', 'C')
('A', 'C', 'B')
('B', 'A', 'C')
('B', 'C', 'A')
('C', 'A', 'B')
('C', 'B', 'A')
"""
3. 원소의 개수가 n개인 조합 구하기
from itertools import combinations
sample = ["A", "B", "C"]
# 원소의 개수가 2개인 조합 출력
for i in combinations(sample, 2):
print(i)
# result output
"""
('A', 'B')
('A', 'C')
('B', 'C')
"""
4. 원소의 개수가 n개인 조합 구하기(중복 허용)
from itertools import combinations_with_replacement
sample = ["A", "B", "C"]
# 중복을 포함한 원소의 개수가 3개인 조합 출력
for i in combinations_with_replacement(sample, 3):
print(i)
# result output
"""
('A', 'A', 'A')
('A', 'A', 'B')
('A', 'A', 'C')
('A', 'B', 'B')
('A', 'B', 'C')
('A', 'C', 'C')
('B', 'B', 'B')
('B', 'B', 'C')
('B', 'C', 'C')
('C', 'C', 'C')
"""
그 외 이터레이터에 대한 참고
https://docs.python.org/ko/3/library/itertools.html
itertools 에서 import 해서 사용한 모듈들은
보통 알고리즘, 혹은 프로젝트에 수학적 로직이 필요할 경우에 사용됨.
어떤 모듈이 어떤 기능을 하는지 외울 필요는 없고,
이런걸 할 수 있구나 정도만 알고 넘어간 후에
필요할 때마다 링크 들어가서 찾아보고 갖다 쓰면 된다.