[파이썬을 파이썬답게] 2차원리스트를 1차원리스트로 만들기 (itertools - chain, reduce, comprehension, sum)

이상해씨·2024년 2월 7일
0

Python

목록 보기
11/21

itertools

📌 itertools
파이썬 내장 모듈 중 하나로 반복가능한 데이터를 다루는데 유용한 도구를 제공. 반복문과 관련된 작업을 간단하게 만들어줌

  • 대표적인 함수
    • itertools.product: 여러 반복 가능한 객체에 대한 곱집합(cartesian product)을 생성
    • itertools.permutations: 주어진 길이의 순열을 생성
    • itertools.combinations: 주어진 길이의 조합을 생성
    • itertools.cycle: 주어진 iterable을 무한히 반복
    • itertools.chain: 여러 iterable을 하나로 연결
    • itertools.count: 무한 등차수열을 생성

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

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

# 방법 1 - sum 함수
answer = sum(my_list, [])
  • itertools.chain
# 방법 2 - itertools.chain
import itertools
list(itertools.chain.from_iterable(my_list))

# 방법 3 - itertools와 unpacking
import itertools
list(itertools.chain(*my_list))
  • comprehension
# 방법 4 - list comprehension 이용
[element for array in my_list for element in array]
  • reduce
# 방법 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))

sum > itertools.chain.from_iterable > itertools.chain > List comprehension > reduce with lambda > reduce

itertools.chain vs itertools.chain.from_iterable

chain

  • itertools.chain 함수는 여러 이터러블을 인자로 받아서, 그 이터러블들을 순차적으로 순회할 수 있는 하나의 이터레이터(iterator)를 반환
  • 각각의 이터러블은 별도의 인자로 전달
import itertools

# 각각의 리스트를 인자로 전달
chain_example = itertools.chain([1, 2, 3], [4, 5, 6])

for item in chain_example:
    print(item)
# 1~6까지 숫자를 출력

chain.from_iterable

  • itertools.chain.from_iterable은 단 하나의 이터러블을 인자로 받음
  • 이 이터러블은 다른 이터러블들의 컬렉션(예: 리스트, 튜플, 세트 등)이어야 하며, 이 함수는 해당 컬렉션 내의 모든 이터러블들을 순차적으로 순회할 수 있는 하나의 이터레이터를 반환
import itertools

# 이터러블들의 리스트를 하나의 인자로 전달
chain_from_iterable_example = itertools.chain.from_iterable([[1, 2, 3], [4, 5, 6]])

for item in chain_from_iterable_example:
    print(item)
# 1~6까지 출력

주요 차이점

  • 사용 방식
    : chain은 여러 이터러블을 별도의 인자로 받으며, chain.from_iterable은 이터러블들의 컬렉션 하나를 인자로 받음
  • 유연성
    : chain.from_iterable은 이터러블을 동적으로 생성하거나, 이터러블의 리스트를 다룰 때 유용
    예를 들어, 이터러블의 정확한 수가 런타임에만 알려져 있는 경우에 chain.from_iterable을 사용할 수 있습니다.
  • 편의성
    : 간단한 사용 사례에서는 chain이 직관적일 수 있으나, 이미 여러 이터러블을 하나의 컬렉션으로 가지고 있는 경우에는 chain.from_iterable이 더 편리

참고

profile
공부에는 끝이 없다

0개의 댓글