본문 바로가기
파이썬

[Python] itertools - 효율적인 루핑을 위한 iterator를 만드는 함수

by 책 읽는 개발자_테드 2022. 5. 8.
반응형

목차

· itertool이란?

· 이터레이터(Iterator)타입

- Infinite iterators

 ▶ count(start, step)

 ▶ cycle(iterable

 ▶ repeat(value, num)

- Combinatoric iterators

 ▶ product()

 ▶ permutations()

 ▶ combinations()

 ▶ combinations_with_replacement()

- Terminating iterators

 ▶ accumulate(iter, func)

 ▶ chain(iter1, iter2)

 ▶ islice(iterable, start, stop, step)


itertool이란?


· 파이썬 3의 표준 라이브러리로, 더 복잡한 반복자를 생성하는 데 사용된다.

· 메모리 효육적이고, 정확한 코드를 만들 수 있도록 사용된다.

 

이터레이터(Iterator)타입


· itertools 모듈에는 다양한 타입의 iterator가 있다.

- Infinite iterators

- Combinatoric iterators

- Terminating iterators

 

Infinite Iterators

· 파이썬에서 for loop를 수행할 수 있는 모든 객체를 iterator라고 부른다.

ex) lists, tuples, set, dictionaries, strings

· 반복자는 무한할 수 있으며, 이러한 타입의 반복자를 무한 반복자(Infinite Iterators)라고 한다.

 

count(start, step)

· start 값 부터 무한대까지 출력한다. 

· step 매개변수는 optional이고, step 값이 제공되면 반복할 때마다 해당 수 만큼 건너 뛴다.

 

import itertools

for i in itertools.count(10, 5):
    if i == 50:
        break
    else:
        print(i, end=" ")

결과

cycle(iterable)

· 전달 받은 인수로 부터 모든 값을 순서대로 출력한다.

· 예시1

import itertools

temp = 0
for i in itertools.cycle("123"):
    if temp > 7:
        break
    else:
        print(i, end=' ')
        temp = temp + 1

결과

· 예시2 - next() 함수 사용

val = ['사과', '배', '수박']
iter = itertools.cycle(val)
for i in range(6):
    print(next(iter), end=" ")

결과

repeat(value, num)

· 무한한 시간 동안 전달된 값을 반복적으로 출력한다. num 매개변수는 optional이다.

import itertools
print(list(itertools.repeat(40, 5)))

결과

  

Combinatoric iterators

· 순열, 조합, 데카르트 곱 같은 조합 구성을 단순화하는데 사용되는 재귀 생성기를 의미한다.

 

product()

· iterable 입력의 데카르트 곱을 계산하는 데 사용된다.

· repeat 키워드는 반복 횟수를 나타낸다.

· 정렬된 튜플 형식으로 출력을 반환한다.

 

from itertools import product

print(list(product([1, 2], repeat=2)))
print()

print(list(product(['사과', '배', '수박'], '5')))
print()

print(list(product('사과', [1, 2])))
print()

결과

 

permutations()

· iterable의 가능한 모든 순열을 생성하는 데 사용된다.

· iterable, group_size 두 인수를 허용한다.

· group_size 값이 없거나 지정되지 않으면, group_size는 iterable의 길이로 바뀐다.

 

from itertools import permutations

print("주어진 리스트의 모든 순열 계산")
print(list(permutations([3, "Python"], 2)))
print()

print("주어진 문자열의 순열")
print(list(permutations('AB')))
print()

print("주어진 컨테이너의 순열")
print(list(permutations(range(3), 2)))

결과

 

combinations()

· 지정된 그룹 크기의 인수로 전달된 컨테이너의 가능한 모든 조합(combinations)을 정렬된 순서로 출력한다.

 

from itertools import combinations

print("list를 정렬된 순서로 조합", list(combinations(['B', 3], 2)))
print()

print("문자열을 정렬된 순서로 조합", list(combinations("ab", 2)))
print()

print("list를 정렬된 순서로 조합", list(combinations(range(10), 1)))

결과

 

combinations_with_replacement()

· 중복 조합을 출력한다.

· 두 개의 인수를 허용한다.

- 첫 번째 인수: r-length tuple 

- 두 번째 인수: 반복수

· iterable의 요소에서 길이가 n인 부분 시퀸스를 반환하고 동일한 프로세스를 반복한다.

· 개별 요소는 반복될 수 있다.

from itertools import combinations_with_replacement

print("list를 정렬된 순서로 조합", list(combinations_with_replacement(['B', 3], 2)))
print()

print("문자열을 정렬된 순서로 조합", list(combinations_with_replacement("ab", 2)))
print()

print("list를 정렬된 순서로 조합", list(combinations_with_replacement(range(10), 1)))

결과

 

Terminating iterators

· 짧은 입력 시퀸스에 대해 작업하고, 사용된 메서드의 기능을 기반으로 출력을 생성한다.

 

accumulate(iter, func)

· 누적된 합을 출력한다.

· 두 개의 인수를 갖는다.

- 첫 번째 인수: iterable

- 두 번째 인수: iterable에서 값이 반복될 때마다 뒤따를 함수

· 두 번째 인수로 함수가 정의 되어 있지 않으면, 기복적으로 덧셈이 발생한다.

· 출력 iterable은 입력 iterable에 따라 다르며, 입력 iterable에 값이 없으면 출력 iterable도 비어 있다.

import itertools
import operator

list1 = [1, 4, 5, 7, 9, 11]

# 요소들의 합 출력
print("The sum is : ", end="")
print(list(itertools.accumulate(list1)))

# 요소들의 곱 출력
print("The product is : ", end="")
print(list(itertools.accumulate(list1, operator.mul)))

결과

 

chain(iter1, iter2)

· 체인 형태로 전달되고 인수로 선언된 iterable의 모든 값을 출력한다.

import itertools

list1 = [1, 2, 3, 4]
list2 = [5, 6, 7, 8]
list3 = [9, 10, 11, 12]

print(list(itertools.chain(list1, list2, list3)))

결과

 

islice(iterable, start, stop, step)

· 주어진 iterable을 주어진 position에 따라 자른다.

· 각각 네 개의 인수를 허용하며 iterable, container, 시작 위치, 종료 위치, step(optional)을 의미한다. 

 

import itertools
list1 = [12, 34, 65, 73, 80, 19, 20]
# 3 번째 인덱스 부터 시작하여 8 번째 인덱스 까지 2개씩 스킵하며 출력한다.
print(list(itertools.islice(list1, 2, 8, 2)))

결과

 

TODO: starmap(func tuple list), dropwhile(func, seq), filterfalse(func, seq), takewhile(func, iterable), tee(iterator, count), zip_longest(iterable1, iterable2, fillval)

 

반응형

댓글