2차원 배열을 1차원 배열로 변환
프로그래밍을 하다 보면 2차원 배열을 1차원 배열로 변환해야 할 때가 있다.
보통 아래와 같이 반복문을 사용해서 리스트를 누적시키는데, 이 외의 방법을 정리한다.
my_list = [[1, 2], [3, 4], [5, 6]]
answer = []
for element in my_list:
answer += element
sum(iterable, start)
sum 함수는 매개변수로 전달받은 start에 iterable의 모든 데이터를 더한다.
list1 = [[1, 10], [2, 22], [3, 19], [4, 7]]
list2 = sum(list1, [])
print(list2)
위 코드에서 sum(list1, [])은 [] + [1, 10] + [2, 22] + [3, 19] + [4, 7]와 같은 연산을 수행한다.
list comprehension
리스트 컴프리헨션을 사용하여 2차원 배열을 1차원 배열로 변환할 수 있다.
list1 = [[1, 10], [2, 22], [3, 19], [4, 7]]
list2 = [data for inner_list in list1 for data in inner_list]
print(list2)
itertools.chain(*)
itertools.chain은 매개변수로 전달받은 iterable 데이터를 연결하여 반환한다. 전달할 매개변수 앞에 *를 붙여주어야 한다.
import itertools
list1 = [[1, 10], [2, 22], [3, 19], [4, 7]]
list2 = list(itertools.chain(*list1))
print(list2)
itertools.chain.from_iterable()
itertools.chain.from_iterable()을 사용하면 * 없이 인자를 전달할 수 있다.
import itertools
list1 = [[1, 10], [2, 22], [3, 19], [4, 7]]
list2 = list(itertools.chain.from_iterable(list1))
print(list2)
functools.reduce()
여러 데이터를 대상으로 누적 집계를 내기 위해 사용하는 reduce 함수를 사용할 수도 있다.
from functools import reduce
import operator
list1 = [[1, 10], [2, 22], [3, 19], [4, 7]]
list2 = list(reduce(operator.add, list1))
print(list2)
# 또는
list2 = list(reduce(lambda x, y: x+y, list1))
print(list2)
numpy.concatenate()
numpy.concatenate()는 2차원 배열을 연결하여 1차원 배열로 만들어준다.
import numpy as np
list1 = [[1], [2, 22], [3, 19], [4, 7]]
list2 = np.concatenate(list1).tolist()
print(list2)
numpy.flatton()
numpy.flatton()을 사용할 수도 있다. 단 flatton은 각 행의 길이가 동일한 경우에만 사용할 수 있다. [['A', 'B'], ['X', 'Y'], ['1']]와 같은 데이터는 1차원 배열로 변환하지 못한다.
import numpy as np
list1 = [[1, 10], [2, 22], [3, 19], [4, 7]]
list2 = np.array(list1).flatten().tolist()
print(list2)
참고 문서
https://codechacha.com/ko/python-flatten-list/
https://programmers.co.kr/learn/courses/4008/lessons/12738