본문 바로가기

카테고리 없음

Python itertools 가이드: 효율적인 반복 처리를 위한 주요 메서드와 예제

 itertools는 Python의 표준 라이브러리 중 하나로, 반복(iteration) 작업을 효율적으로 수행할 수 있게 해주는 고성능 모듈입니다. itertools는 특히 효율적으로 메모리를 사용하여 큰 데이터셋을 다룰 수 있으며, 복잡한 반복 작업을 간단하게 표현할 수 있는 함수형 도구들을 제공합니다. 이러한 이유로, itertools는 데이터 처리나 알고리즘 개발에 유용하며, Pythonic한 코드를 작성하는 데 큰 도움이 됩니다. 

 itertools 의 메소드들은 대부분 iterator 를 반환하니 반복문이나 list(),tuple() 등을 사용하여 값을 확인할 수 있습니다.

 

다음은 자주 사용하는 itertools 메서드 10가지의 기능을 설명하고, 예제를 포함한 활용 방법을 보여드리겠습니다.

1. islice()

islice()는 리스트와 같은 시퀀스나 반복 가능한 객체에서 특정 구간이나 간격으로 요소를 잘라낼 때 사용합니다. 특히 큰 데이터셋에서 필요한 부분만 선택하는 데 유용합니다.

from itertools import islice

# 예제: 리스트에서 인덱스 2부터 8까지 요소를 2 간격으로 선택
data = list(range(10))
print(list(islice(data, 2, 8, 2)))  # [2, 4, 6]

 

2. count()

count()는 무한 반복을 수행하며 일정한 간격으로 증가하는 값을 생성합니다. 시작 값과 간격을 지정할 수 있습니다.

from itertools import count, islice

# 예제: 5부터 시작하여 0.5씩 증가하는 값을 무한으로 생성합니다.
counter = count(5, 0.5)

#islice와의 조합으로 유한의 숫자배열을 만들 수 있습니다.
print(list(islice(counter, 10)))  # [5.0, 5.5, 6.0, ..., 9.5] - 0~9까지 10개 요소 출력

 

3. cycle()

cycle()은 주어진 시퀀스를 무한히 반복합니다. 예를 들어, 특정 패턴을 반복해야 하는 경우 유용합니다.

from itertools import repeat

# 예제: 값 10을 5번 반복
print(list(repeat(10, 5)))  # [10, 10, 10, 10, 10] - 마지막 인자가 없으면 무한 반복합니다.

 

4. combinations()

combinations()는 입력된 시퀀스에서 순서를 고려하지 않고 지정된 길이의 모든 조합을 반환합니다. 

from itertools import combinations

# 예제: 리스트에서 길이 2의 모든 조합 생성
items = ['A', 'B', 'C', 'D']
print(list(combinations(items, 2)))  
# [('A', 'B'), ('A', 'C'), ('A', 'D'), ('B', 'C'), ('B', 'D'), ('C', 'D')]
# 순서를 고려하지 않으므로 ('A', 'B')와 ('B', 'A')는 동일하게 취급되어 하나만 출력됩니다.

 

5. product()

product()는 모든 가능한 순열을 반환하며, repeat 인수를 사용하여 요소를 중복으로 포함할 수 있습니다.

from itertools import product

# 예제: 0과 1의 조합으로 길이 3의 모든 가능한 패턴 생성
print(list(product([0, 1], repeat=3)))  
# [(0, 0, 0), (0, 0, 1), (0, 1, 0), (0, 1, 1), (1, 0, 0), (1, 0, 1), (1, 1, 0), (1, 1, 1)]

 

6. filterfalse()

filterfalse()는 주어진 조건에 맞지 않는 요소들만 반환합니다. 기본 filter() 함수와 반대로 작동하여 조건이 False인 요소들만 선택합니다.

from itertools import filterfalse

# 예제: 홀수만 필터링하여 리스트 반환
data = [1, 2, 3, 4, 5]
print(list(filterfalse(lambda x: x % 2 == 0, data)))  # [1, 3, 5]

 

7. accumulate()

accumulate()는 누적 합계를 계산하거나, 다른 이항 함수를 적용하여 누적 계산을 수행합니다. 기본적으로 합계를 계산하지만, operator 모듈의 함수를 사용하여 누적 곱셈, 최댓값 등을 구할 수 있습니다.

from itertools import accumulate
import operator

# 예제: 숫자 리스트의 누적 합계
data = [1, 2, 3, 4, 5]
print(list(accumulate(data)))  # [1, 3, 6, 10, 15]

# 예제: 누적 곱
print(list(accumulate(data, operator.mul)))  # [1, 2, 6, 24, 120]

#예제: 누적 최대
data = [1, 3, 2, 7, 4]
print(list(accumulate(data, max)))  # [1, 3, 3, 7, 7]

 

8. chain()

chain()은 여러 iterable을 하나의 연속된 iterable로 연결합니다. 여러 리스트나 튜플을 하나의 시퀀스로 합칠 때 유용합니다.

# 예제: 여러 리스트를 하나로 연결
list1 = [1, 2, 3]
list2 = ['A', 'B', 'C']
print(list(chain(list1, list2)))  # [1, 2, 3, 'A', 'B', 'C']

 

9. groupby()

groupby()는 연속된 중복 요소들을 그룹으로 묶어 줍니다. 특정 키 함수를 제공해 그룹을 나눌 수 있으며, 반복 가능한 데이터를 정렬 후 사용할 때 유용합니다.

from itertools import groupby

# 예제: 문자 리스트에서 연속된 동일 문자를 그룹화
data = ['A', 'A', 'B', 'B', 'A']
grouped = [(key, list(group)) for key, group in groupby(data)]
print(grouped)  # [('A', ['A', 'A']), ('B', ['B', 'B']), ('A', ['A'])]

 

 

10. takewhile()

takewhile()는 조건이 True인 동안 요소를 반환하고, 조건이 False가 되는 순간 중단됩니다. 주어진 조건이 만족되는 동안만 요소를 선택하는 데 유용합니다.

from itertools import takewhile

# 예제: 5보다 작은 값만 선택
data = [1, 4, 6, 3, 2]
print(list(takewhile(lambda x: x < 5, data)))  # [1, 4]

#count와의 조합으로 유한의 숫자배열을 만들 수 있습니다.
print(list(takewhile(lambda x: x < 10, count(1, 2.5)))) # [1, 3.5, 6.0, 8.5]

 

 

이와 같은 itertools 메서드들은 데이터 처리, 알고리즘, 조합 생성 등에서 매우 강력한 도구가 됩니다.