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

Python에서 얕은 중첩 리스트를 평면화하는 방법

Python에서 얕은 목록을 평면화하는 방법

Python으로 작업하다 보면 [[10, 20], [30, 40]]처럼 리스트 안에 리스트가 들어 있는 형태의 중첩 리스트(nested list)를 하나의 평평한 리스트로 만들어야 하는 경우가 자주 있습니다. 이런 작업을 리스트 평면화(flattening)라고 부르며, 대표적인 두 가지 방법을 소개합니다.

1. 중첩 for 루프 사용하기

가장 단순하고 직관적인 방법은 두 개의 중첩된 for 루프를 사용해 하위 리스트의 요소들을 하나씩 새로운 평면 리스트에 추가하는 것입니다.

lst = [[10, 20, 30, 40], [50, 60, 70, 80], [90, 100, 110, 120]]
flatlist = []
for sublist in lst:
   for item in sublist:
      flatlist.append(item)
print(flatlist)

실행 결과:

[10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120]

이 방법은 코드가 길어지는 단점이 있지만, 초보자도 로직을 쉽게 이해할 수 있다는 장점이 있습니다.

2. itertools.chain() 함수 사용하기

더 간결하고 Pythonic한 방법은 표준 라이브러리인 itertools 모듈의 chain() 함수를 활용하는 것입니다. chain(*lst)는 각 하위 리스트를 하나의 반복 가능한(iterable) 시퀀스로 연결해 줍니다.

>>> lst = [[10, 20, 30, 40], [50, 60, 70, 80], [90, 100, 110, 120]]
>>> import itertools
>>> flatlist = list(itertools.chain(*lst))
>>> flatlist
[10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120]

itertools.chain()은 내부적으로 최적화되어 있어 성능 면에서도 유리하며, 한 줄로 깔끔하게 처리할 수 있어 실무에서 널리 사용됩니다.

보너스: 리스트 컴프리헨션 활용하기

추가로, 외부 모듈 없이 리스트 컴프리헨션(list comprehension)만으로도 평면화할 수 있습니다.

lst = [[10, 20, 30, 40], [50, 60, 70, 80], [90, 100, 110, 120]]
flatlist = [item for sublist in lst for item in sublist]
print(flatlist)  # [10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120]

정리

  • 중첩 for 루프: 직관적이고 이해하기 쉬움
  • itertools.chain(): 간결하고 성능이 우수함
  • 리스트 컴프리헨션: 별도 임포트 없이 한 줄로 처리 가능

상황과 코드 스타일에 맞게 적절한 방법을 선택하시면 됩니다. 다만 위 방법들은 얕은(shallow) 중첩, 즉 한 단계 깊이의 리스트에만 적용되므로, 여러 단계로 중첩된 리스트는 재귀 함수 등 별도의 처리가 필요하다는 점을 참고하세요.