itertools
itertools는 내장모듈이다.
import itertools
1. 여러 이터레이터 연결
(1) chain
여러 이터레이터를 하나의 순차적인 이터레이터로 합치고 싶을 때 사용
iter = itertools.chain([1,2,3], [4,5,6])
print(list(iter))
>>>
[1, 2, 3, 4, 5, 6]
(2) repeat
동일한 값을 반복하고 싶을 때 사용
iter = itertools.repeat(10, 3)
print(list(iter))
>>>
[10, 10, 10]
(3) cycle
원소들을 반복하고 싶을 때 사용
iter = itertools.cycle('ABCD')
result = [next(iter) for _ in range(10)]
print(result)
>>>
['A', 'B', 'C', 'D', 'A', 'B', 'C', 'D', 'A', 'B']
iter = itertools.cycle([4, 7])
result = [next(iter) for _ in range(10)]
print(result)
>>>
[4, 7, 4, 7, 4, 7, 4, 7, 4, 7]
(4) tee
하나의 이터레이터를 병렬적으로 늘림(이터레이터 깊은 복사)
iter1, iter2, iter3 = itertools.tee(['test', '복사'], 3)
print(list(iter1))
print(list(iter2))
print(list(iter3))
>>>
['test', '복사']
['test', '복사']
['test', '복사']
-------------------------------------------------------
iter1, iter2, iter3 = itertools.tee(['test', '복사'], 3)
iterList = list(iter1)
iterList[0] = "change"
print(iterList)
print(list(iter2))
print(list(iter3))
list1 = ['test', '복사']
list2 = list1
list3 = list1
list_copy_iter, _ = itertools.tee(list1, 2)# 깊은복사
list4 = list(list_copy_iter)
list1[0] = "change"
print(list1)
print(list2)
print(list3)
print(list4)
>>>
['change', '복사']
['test', '복사']
['test', '복사']
['change', '복사']
['change', '복사']
['change', '복사']
['test', '복사']
(5) zip longest
key와 value값의 이터레이터를 다 사용할 경우 fillvalue로 지정한 값을 채워준다.
※ fillvalue 디폴트 값은 None이다.
keys = ['A', 'A', 'C', 'B']
values = ['+', '-']
temp = list(zip(keys, values))
print("zip: ", temp)
iter = itertools.zip_longest(keys, values, fillvalue=0)
longest= list(iter)
print('zip_longest: ', longest)
>>>
zip: [('A', '+'), ('A', '-')]
zip_longest: [('A', '+'), ('A', '-'), ('C', 0), ('B', 0)]
2. 이터레이터에서 원소 거르기
이터레이터에서 원소를 필터링할 때 쓸 수 있는 여러 함수
(1) islice
시퀀스 슬라이스나 스트라이딩 기능과 비슷함
values = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
#end
first_five = itertools.islice(values, 5)
print(list(first_five))
#start, end
except_start_end = itertools.islice(values, 1, len(values) - 1)
print(list(except_start_end))
# start, end, iter
middle_odds = itertools.islice(values, 2, 8, 2)
print(list(middle_odds))
>>>
[1, 2, 3, 4, 5]
[2, 3, 4, 5, 6, 7, 8, 9]
[3, 5, 7]
(2) takewhile
이터레이터에서 주어진 술어(predicate)가 False를 반환하는 첫 원소가 나타날 때까지 원소를 돌려줌
values = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
less_than_seven = lambda x: x<7
iter = itertools.takewhile(less_than_seven, values)
print(list(iter))
>>>
[1, 2, 3, 4, 5, 6]
(3) dropwhile
이터레이터에서 주어진 술어(predicate)가 False를 반환하는 첫 원소가 나타날 때까지 원소를 건너뛴다.
values = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
less_than_seven = lambda x: x<7
iter = itertools.dropwhile(less_than_seven, values)
print(list(iter))
>>>
[7, 8, 9, 10]
(4) filterfalse
filter 내장함수의 반대 결과를 얻을 수 있음
values = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
evens = lambda x: x % 2 == 0
filter_result = filter(evens, values)
filter_false_result = itertools.filterfalse(evens, values)
print(list(filter_result))
print(list(filter_false_result))
>>>
[2, 4, 6, 8, 10]
[1, 3, 5, 7, 9]
3. 이터레이터에서 원소의 조합 만들어내기
(1) accumulate
(2) product
(3) permutations
(4) combinations
(5) combinations_with_replacement
'Python > 파이썬스럽게 개발하기' 카테고리의 다른 글
[python] mimesis - 파이썬 mock 데이터 (0) | 2022.08.18 |
---|---|
[python] haversine, 위도 경도를 이용하여 거리를 구하는 모듈 (0) | 2022.07.26 |
[python] *args and **kwargs (0) | 2022.07.19 |
[python] 파이썬스럽게 개발하기 다수의 링크 (0) | 2022.07.19 |
[Python3] 동시성과 병렬성 (0) | 2021.04.16 |