본문 바로가기

Python

[파이썬] itertools 모음

특정 조건을 반복할 때 유용하게 쓰이는 파이썬의 내장 함수입니다.

 

순열, 조합 (permutations, combinations)

 

순열: 전체 아이템 n개 중에 r개를 나열

조합: 전체 아이템 n개 중에 r개를 선택 (중복된 조합 불가)

from itertools import permutations, combinations

letters = ['A', 'B', 'C']

p = permutations(letters, 2)  # 3개의 알파벳 중 2개를 사용하여 순열
print(list(p))

'''
[('A', 'B'), ('A', 'C'), ('B', 'A'), ('B', 'C'), ('C', 'A'), ('C', 'B')]
'''

c = combinations(letters, 2)  # 3개의 알파벳 중 2개를 사용하여 조합
print(list(c))

'''
[('A', 'B'), ('A', 'C'), ('B', 'C')]
'''

combinations_with_replacement 를 통해 중복 조합을 가능하게 할 수 있습니다

from itertools import combinations_with_replacement

letters = ['A', 'B', 'C']

res = list(combinations_with_replacement(letters, 2))
print(res)

'''
[('A', 'A'), ('A', 'B'), ('A', 'C'), ('B', 'B'), ('B', 'C'), ('C', 'C')]
'''

 

product

전체 아이템 중 n개를 묶는 방법입니다.

combinations_with_replacement와의 차이점은 같은 아이템 쌍이라 할지라도 순서가 다르게 나온다는 점입니다

(예: ('A', 'B') 와 ('B', 'A') 둘다 출현).

from itertools import product

letters = ['A', 'B', 'C']

res = list(product(letters, repeat=2)) #3개의 알파벳 중 2개를 사용하여 묶음 (같은 알파벳 허용)
print(res)

'''
[('A', 'A'), ('A', 'B'), ('A', 'C'), ('B', 'A'), ('B', 'B'), ('B', 'C'), ('C', 'A'), ('C', 'B'), ('C', 'C')]
'''

아래와 같이 2가지 이상의 아이템 list들을 묶는 데에도 사용이 됩니다.

from itertools import product

numbers = [1, 2]
letters = ['A', 'B']
korean = ['가', '나']

print(list(product(numbers, letters, korean)))

'''
[(1, 'A', '가'), (1, 'A', '나'), (1, 'B', '가'), (1, 'B', '나'), 
(2, 'A', '가'), (2, 'A', '나'), (2, 'B', '가'), (2, 'B', '나')]
'''

 

compress

같은 길이의 list를 2개 받은 뒤 (첫번째: 유지하거나 제거할 list, 두번째 1/0 or True/False로 이루어진 list)

2번째의 list가 1 or True이면 유지, 0 or False이면 첫번째 list에서 동일 index를 제거하는 방법입니다.

아래 예시를 보시면 true_or_false의 첫번째, 세번째 항목이 1, 1 나머지 항목이 0이기 때문에,

letters 이름의 list에서 'A', 'C'만 유지되고 나머지 아이템은 제거가 되었습니다.

from itertools import compress

letters = ['A', 'B', 'C', 'D', 'E']
true_or_false = [1, 0, 1, 0, 0]
#true_or_false = [True, False, True, False, False]

print(list(compress(letters, numbers)))

'''
['A', 'C']
'''

 

repeat

특정 아이템을 단순히 n번 반복해주는 함수입니다.

from itertools import repeat
print(list(repeat('Hello', 3)))

'''
['Hello', 'Hello', 'Hello']
'''