Python itertools

popawaw·2021년 3월 28일
0

Pythonic

목록 보기
2/2
post-thumbnail

곱집합(Cartesian product) 구하기 - product

보통 사람들은 for 문을 이용해 두 iterable의 원소를 하나씩 곱해갑니다.

iterable1 = 'ABCD'
iterable2 = 'xy'
iterable3 = '1234'

for value1 in iterable1:
    for value2 in iterable2:
        for value3 in iterable3:
            print(value1, value2, value3)

파이썬에서는
itertools.product를 이용하면, for 문을 사용하지 않고도 곱집합을 구할 수 있습니다.

import itertools

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

2차원 리스트를 1차원 리스트로 만들기 - from_iterable

파이썬에서는
파이썬의 다양한 기능을 사용하면, for 문을 사용하지 않고도 리스트를 이어 붙일 수 있습니다.
my_list = [[1, 2], [3, 4], [5, 6]]

방법 1 - sum 함수

answer = sum(my_list, [])

방법 2 - itertools.chain

import itertools
list(itertools.chain.from_iterable(my_list))

방법 3 - itertools와 unpacking

import itertools
list(itertools.chain(*my_list))

방법 4 - list comprehension 이용

[element for array in my_list for element in array]

방법 5 - reduce 함수 이용 1

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], [2]]
  • [[1, 2], [2, 3], [4, 5]]

다음과 같이 같이 각 원소의 길이가 다른 리스트는 편평하게 만들 수 없습니다.

  • [['A', 'B'], ['X', 'Y'], ['1’]]
profile
개발 재밌따..ㅎ

0개의 댓글