파이썬

[파이썬] 2차원 리스트 1차원 리스트로 변환

앤테바 2022. 3. 23. 07:59
반응형

2차원 리스트가 있고, 이를 1차원 리스트로 변환해야 하는 경우가 종종 발생합니다.

 

2차원 리스트

nums = [
    [1, 2, 3],
    [4, 5],
    [6, 7, 8]
]

1차원 리스트로 변환

nums = [1, 2, 3, 4, 5, 6, 7, 8]

아주 다양한 방법들이 많은데 하나씩 살펴 보겠습니다.

 

방법1) 반복문

직관적으로 반복문을 이용해서 만듭니다.

빈 리스트에 계속 더해가면서 1차원으로 만들어 가는 방식입니다.

nums = [
    [1, 2, 3],
    [4, 5],
    [6, 7, 8]
]

nums_flat = []
for arr in nums:
    nums_flat += arr

print(nums_flat)

출력

[1, 2, 3, 4, 5, 6, 7, 8]

방법2) sum()

방법1의 반복문 기법을 자세히 살펴 보시면 [] 빈 리스트에 리스트를 계속 더해가는 방식입니다.

sum() 함수로 반복문을 대체 할 수 있습니다. sum() 함수의 두 번째 인자(start)에 초기값을 지정할 수 있는데 default로 0인데 이를 []를 넘겨주면 방법1과 동일한 수행하게 됩니다.

nums = [
    [1, 2, 3],
    [4, 5],
    [6, 7, 8]
]

num_flat = list(sum(nums, []))

print(num_flat)

출력

[1, 2, 3, 4, 5, 6, 7, 8]

방법3) itertools.chain

itertools.chain을 이용해서 iterable한 객체들을 체인처럼 연결하는 함수입니다.

chain()에 iterable 객체를 넘길 때 unpacking해서 넘겨야 합니다.

import itertools

nums = [
    [1, 2, 3],
    [4, 5],
    [6, 7, 8]
]

nums_flat = list(itertools.chain(*nums))

print(nums_flat)

출력

[1, 2, 3, 4, 5, 6, 7, 8]

itertools.chain.from_iterable() 함수도 사용 가능합니다.

import itertools

nums = [
    [1, 2, 3],
    [4, 5],
    [6, 7, 8]
]

nums_flat = list(itertools.chain.from_iterable(nums))

print(nums_flat)

출력

[1, 2, 3, 4, 5, 6, 7, 8]

방법4) list comprehensin

nums = [
    [1, 2, 3],
    [4, 5],
    [6, 7, 8]
]

nums_flat = [n for arr in nums for n in arr]

print(nums_flat)

출력

[1, 2, 3, 4, 5, 6, 7, 8]

방법5) reduce()

동작은 sum()과 동일하게 보면 될 것 같습니다.

 

reduce syntax

reduce(집계 함수, 순회 가능한 데이터[, 초기값])

 

from functools import reduce

nums = [
    [1, 2, 3],
    [4, 5],
    [6, 7, 8]
]

nums_flat = list(reduce(lambda x, y: x + y, nums))

print(nums_flat)

출력

[1, 2, 3, 4, 5, 6, 7, 8]

 

 

반응형