본문 바로가기
Etc./Python

[Python] itertools

by ahj 2021. 10. 10.

곱집합을 해주려면

예를 들어 'ABCD' 'xy' 두 문자열을 Ax Ay Bx By Cx Cy 이렇게 묶어주려면

for문을 2개는 돌려야 할거다

그런데 itertools의 product를 이용하면 매우 간단하게 구현 가능

import itertools

iterable1 = 'ABCD'
iterable2 = 'xy'
iterable3 = '1234'
print(list(itertools.product(iterable1, iterable2, iterable3)))

이렇게 구현 가능!

이려면 

[('A', 'x', '1'), ('A', 'x', '2'), ('A', 'x', '3'), ('A', 'x', '4'), ('A', 'y', '1'), ('A', 'y', '2'), ('A', 'y', '3'), ('A', 'y', '4'), ('B', 'x', '1'), ('B', 'x', '2'), ('B', 'x', '3'), ('B', 'x', '4'), ('B', 'y', '1'), ('B', 'y', '2'), ('B', 'y', '3'), ('B', 'y', '4'), ('C', 'x', '1'), ('C', 'x', '2'), ('C', 'x', '3'), ('C', 'x', '4'), ('C', 'y', '1'), ('C', 'y', '2'), ('C', 'y', '3'), ('C', 'y', '4'), ('D', 'x', '1'), ('D', 'x', '2'), ('D', 'x', '3'), ('D', 'x', '4'), ('D', 'y', '1'), ('D', 'y', '2'), ('D', 'y', '3'), ('D', 'y', '4')]

이렇게 출력!

 

 

list 이어 붙이기

my_list = [[1, 2], [3, 4], [5, 6]]

# 방법 1 - sum 함수
answer = sum(my_list, [])

# 방법 2 - itertools.chain 하나의 iterator만 전달해도 모든 요소들을 조회하면서 넘겨준다.
import itertools
list(itertools.chain.from_iterable(my_list))

# 방법 3 - itertools와 unpacking 2차원 리스트를 한 번 unpacking해서 넘겨준다.
import itertools
list(itertools.chain(*my_list))

# 방법 4 - list comprehension 이용
[element for array in my_list for element in array]

# 방법 5 - reduce 함수 이용 1 reduce(function, iterable[, initializer]) 형식
from functools import reduce
list(reduce(lambda x, y: x+y, my_list))

# 방법 6 - reduce 함수 이용 2 초기값을 기준으로 데이터를 루프 돌면서 집계 함수를 적용해 데이터를 누적하는 방식으로 작동
from functools import reduce
import operator
list(reduce(operator.add, my_list))

이렇게 많은 방법이..ㄷㄷ 아직 익숙하지 않지만 문제 주어질때마다 활용해보고 익숙해지자

 

제한적으로 사용 가능한 방법

아래의 방법은 각 원소의 길이가 동일한 경우에만 사용 가능합니다.

# 방법 7 - numpy 라이브러리의 flatten 이용
import numpy as np
np.array(my_list).flatten().tolist()

다차원 배열을 1차원 배열로 평평하게(flatten)해준다.

'Etc. > Python' 카테고리의 다른 글

[Python] itertools-2  (0) 2021.10.10
[Python] list 나름 정리  (0) 2021.10.10
[Python] join  (0) 2021.10.10
[Python] zip  (0) 2021.10.10
[Python] 리스트 내포(List comprehension)  (0) 2021.10.10

댓글