Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python에서 2차원 리스트를 1차원으로 평면화하는 5가지 방법

파이썬에서 리스트(list)는 순서가 있고 변경 가능한 자료형입니다. 대괄호([])로 작성하며, 인덱스 번호를 통해 요소에 접근할 수 있습니다. 음수 인덱싱은 뒤에서부터 접근하는 방식으로, -1은 마지막 요소를 의미합니다.

실무에서는 중첩된 2차원 리스트를 하나의 1차원 리스트로 만들어야 하는 경우가 자주 발생하는데, 이를 평면화(flatten)라고 합니다. 이번 글에서는 파이썬에서 2차원 리스트를 1차원으로 변환하는 다양한 방법을 예제와 함께 살펴보겠습니다.

방법 1: itertools.chain.from_iterable() 사용

itertools 모듈의 chain.from_iterable()은 각 하위 리스트의 요소를 하나씩 연결해주는 효율적인 방식입니다. 대용량 데이터 처리 시에도 성능이 우수합니다.

from itertools import chain

ini_list = [[1, 2, 3],
            [3, 6, 7],
            [7, 5, 4]]

# 초기 리스트 출력
print("initial list", str(ini_list))

# chain.from_iterable()로 2차원 리스트를 1차원으로 변환
flatten_list = list(chain.from_iterable(ini_list))

# 결과 출력
print("final_result", str(flatten_list))

방법 2: 리스트 컴프리헨션(List Comprehension) 사용

리스트 컴프리헨션은 별도의 모듈 import 없이 가장 파이썬다운 문법으로 평면화할 수 있는 방법입니다. 코드가 간결하고 가독성이 좋아 많이 사용됩니다.

ini_list = [[1, 2, 3],
            [3, 6, 7],
            [7, 5, 4]]

print("initial list", str(ini_list))

# 리스트 컴프리헨션으로 2차원 리스트를 1차원으로 변환
flatten_list = [j for sub in ini_list for j in sub]

print("final_result", str(flatten_list))

방법 3: functools.reduce() 사용

functools.reduce()와 람다 함수를 조합하면 하위 리스트들을 순차적으로 더해 하나의 리스트로 합칠 수 있습니다.

from functools import reduce

ini_list = [[1, 2, 3],
            [3, 6, 7],
            [7, 5, 4]]

print("initial list", str(ini_list))

# reduce()로 2차원 리스트를 1차원으로 변환
flatten_list = reduce(lambda z, y: z + y, ini_list)

print("final_result", str(flatten_list))

방법 4: sum() 함수 사용

sum() 함수에 시작값으로 빈 리스트([])를 지정하면 하위 리스트들이 모두 더해져 하나의 리스트가 됩니다. 코드가 매우 짧다는 장점이 있지만, 요소 수가 많을 때는 성능이 떨어질 수 있습니다.

ini_list = [[1, 2, 3],
            [3, 6, 7],
            [7, 5, 4]]

print("initial list", str(ini_list))

# sum()으로 2차원 리스트를 1차원으로 변환
flatten_list = sum(ini_list, [])

print("final_result", str(flatten_list))

방법 5: 람다(Lambda) 재귀 함수 사용

람다 표현식과 재귀 호출을 활용하면 깊이가 2단계 이상인 중첩 리스트까지 한 번에 평면화할 수 있습니다.

ini_list = [[1, 2, 3],
            [3, 6, 7],
            [7, 5, 4]]

# 람다 재귀 함수로 평면화
flatten_list = lambda y: [x for a in y for x in flatten_list(a)] if type(y) is list else [y]

print("Initial list", ini_list)
print("Flattened List", flatten_list(ini_list))

실행 결과

위의 모든 방법은 동일한 결과를 반환합니다.

initial list [[1, 2, 3], [3, 6, 7], [7, 5, 4]]
final_result [1, 2, 3, 3, 6, 7, 7, 5, 4]

마무리

각 방법의 특징을 정리하면 다음과 같습니다.

  • chain.from_iterable(): 반복자 기반으로 메모리 효율이 좋고 대용량 데이터에 적합
  • 리스트 컴프리헨션: import 없이 간결하고 가독성이 뛰어나 가장 널리 사용됨
  • reduce(): 함수형 프로그래밍 스타일에 적합하지만 가독성은 상대적으로 낮음
  • sum(): 코드가 가장 짧지만 리스트 연산이 반복되어 성능 저하 가능
  • 람다 재귀: 임의의 깊이를 가진 중첩 리스트까지 처리 가능

상황에 맞는 방법을 선택하여 2차원 리스트를 손쉽게 평면화해 보세요.