Python의 itertools 라이브러리는 효율적인 반복을 위한 다양한 함수를 제공하는 강력한 도구입니다.
[요약]
1. count(start = 0, step = 1)
start 부터 step 만큼 무한히 증가하는 숫자 생성
2. cycle(iterable)
요소를 무한히 순환하면서 생성
3. repeat(object[, times])
object를 times 만큼 반복하거나, times 가 생략되면 무한히 반복
4. permutations(iterable, r=None)
iterable 에서 r 개의 요소를 뽑아 나열하는 모든 순열을 생성순서가 다르면 다른 결과로 취급
5. combinations(iterable, r)
iterable 에서 r 개의 요소를 뽑아 만들 수 있는 모든 조합을 생성순서는 고려하지 않음 -> 순서가 같으면 같은 거
6. product(*iterables, repeat=1)
여러 개의 iterable들 간의 데카르트 곱을 구한다
7. chain(*iterables)
여러 개의 iterable을 하나로 연결하여 새로운 iterable 한 요소를 생성8. islice(iterable, start, stop[, step])이터레이터 버전 슬라이싱
무한 이터레이터 (Infinite Iterators)
이 함수들은 무한한 시퀀스를 생성합니다. 따라서 사용할 때에는 반드시 종료 조건을 함께 사용해야 합니다.
1. itertools.count(start=0, step=1)
count()는 start 값부터 step 만큼씩 무한히 증가하는 숫자를 생성합니다.
예시: 10부터 2씩 증가하는 숫자 5개를 출력합니다.
import itertools
# 10에서 시작하여 2씩 증가하는 이터레이터 생성
counter = itertools.count(start=10, step=2)
# 5개의 숫자 출력
for _ in range(5):
print(next(counter))
출력:
10
12
14
16
18
2. itertools.cycle(iterable)
cycle()은 인자로 받은 반복 가능한(iterable) 객체의 요소들을 무한히 순환하면서 생성합니다.
예시: 신호등의 색깔을 계속해서 순환 출력합니다.
import itertools
import time
traffic_light = itertools.cycle(['🔴', '🟡', '🟢'])
for _ in range(6):
print(next(traffic_light))
time.sleep(1) # 1초 대기
출력:
🔴
🟡
🟢
🔴
🟡
🟢
3. itertools.repeat(object[, times])
repeat()는 object를 times 만큼 반복하거나, times가 생략되면 무한히 반복합니다.
예시: 'Hello'를 3번 반복하여 리스트를 생성합니다.
import itertools
repeater = itertools.repeat('Hello', times=3)
print(list(repeater))
출력:
['Hello', 'Hello', 'Hello']
조합 이터레이터 (Combinatoric Iterators)
이 함수들은 입력받은 데이터로부터 순열, 조합 등과 같은 조합적 시퀀스를 생성합니다.
4. itertools.permutations(iterable, r=None)
permutations()는 iterable에서 r개의 요소를 뽑아 나열하는 모든 순열을 생성합니다. 순서가 다르면 다른 경우로 취급합니다. r을 생략하면 iterable의 전체 길이로 설정됩니다.
예시: 리스트 [1, 2, 3]에서 2개의 요소를 뽑아 만들 수 있는 모든 순열을 구합니다.
import itertools
items = [1, 2, 3]
p = itertools.permutations(items, 2)
print(list(p))
출력: (1, 2)와 (2, 1)은 다른 순서이므로 모두 포함됩니다.
[(1, 2), (1, 3), (2, 1), (2, 3), (3, 1), (3, 2)]
5. itertools.combinations(iterable, r)
combinations()는 iterable에서 r개의 요소를 뽑는 모든 조합을 생성합니다. 순서는 고려하지 않습니다.
예시: 리스트 [1, 2, 3, 4]에서 2개의 요소를 뽑아 만들 수 있는 모든 조합을 구합니다.
import itertools
items = [1, 2, 3, 4]
c = itertools.combinations(items, 2)
print(list(c))
출력: (1, 2)와 (2, 1)은 같은 조합이므로 (1, 2)만 포함됩니다.
[(1, 2), (1, 3), (1, 4), (2, 3), (2, 4), (3, 4)]
6. itertools.product(*iterables, repeat=1)
product()는 여러 개의 iterable들 간의 **데카르트 곱(Cartesian product)**을 구합니다. 중첩된 for문과 동일한 결과를 반환합니다.
예시: 두 리스트 ['a', 'b']와 [1, 2]의 데카르트 곱을 구합니다.
import itertools
list1 = ['a', 'b']
list2 = [1, 2]
prod = itertools.product(list1, list2)
print(list(prod))
출력:
[('a', 1), ('a', 2), ('b', 1), ('b', 2)]
기타 유용한 이터레이터
7. itertools.chain(*iterables)
chain()은 여러 개의 iterable을 하나로 연결하여 새로운 이터레이터를 생성합니다.
예시: 두 개의 리스트와 하나의 튜플을 연결합니다.
import itertools
list1 = [1, 2, 3]
list2 = ['a', 'b']
tuple1 = ('X', 'Y')
chained_iter = itertools.chain(list1, list2, tuple1)
print(list(chained_iter))
출력:
[1, 2, 3, 'a', 'b', 'X', 'Y']
8. itertools.islice(iterable, start, stop[, step])
islice()는 이터레이터 버전의 슬라이싱입니다. start, stop, step 인자를 사용하여 이터레이터의 일부를 잘라낼 수 있습니다.
예시: range(10) 이터레이터에서 인덱스 2부터 8까지 2씩 건너뛰며 값을 가져옵니다.
import itertools
sliced_iter = itertools.islice(range(10), 2, 8, 2)
print(list(sliced_iter))
출력:
[2, 4, 6]
'Study > Python' 카테고리의 다른 글
| [개념]여러가지 내장함수 정리 (1) | 2025.07.15 |
|---|