리스트 안에 또 다른 리스트가 포함된 중첩 리스트(nested list)를 하나의 1차원 리스트로 펼치는 작업을 '평탄화(flattening)'라고 합니다. 파이썬에서는 재귀(recursion) 기법과 함께 단순 인덱싱 및 isinstance 메서드를 사용하면 이 작업을 매우 간결하게 처리할 수 있습니다.
재귀란 큰 문제를 작은 단위로 나누어 각 부분의 결과를 계산한 뒤, 이 결과들을 다시 결합하여 전체 문제의 해답을 도출하는 방식입니다. 구조가 반복적으로 중첩되는 리스트 평탄화 문제에 특히 적합한 접근법입니다.
예제 코드
다음은 재귀를 사용해 중첩 리스트를 평탄화하는 파이썬 프로그램입니다.
def flatten_list(my_list):
if my_list == []:
return my_list
if isinstance(my_list[0], list):
return flatten_list(my_list[0]) + flatten_list(my_list[1:])
return my_list[:1] + flatten_list(my_list[1:])
my_list = [[1,2],[3,4], [90, 11], [56, 78], [[34,56]]]
print("The list is :")
print(my_list)
print("The list after flattening is : ")
print(flatten_list(my_list))실행 결과
The list is : [[1, 2], [3, 4], [90, 11], [56, 78], [[34, 56]]] The list after flattening is : [1, 2, 3, 4, 90, 11, 56, 78, 34, 56]
코드 동작 원리
flatten_list라는 이름의 함수를 정의하고, 리스트를 매개변수로 받습니다.- 먼저 입력된 리스트가 빈 리스트인지 확인합니다. 빈 리스트라면 그대로 반환하며, 이것이 재귀 호출을 멈추는 종료 조건(base case) 역할을 합니다.
isinstance메서드로 리스트의 첫 번째 요소의 자료형이 리스트인지 검사합니다.- 첫 번째 요소가 리스트라면, 해당 요소를 재귀 호출로 평탄화한 결과와 나머지 요소(
my_list[1:])를 재귀적으로 평탄화한 결과를 연결(concatenate)하여 반환합니다. - 이 과정이 반복되면서 아무리 깊게 중첩된 리스트도 완전히 펼쳐지게 됩니다.
- 첫 번째 요소가 리스트가 아니라면, 첫 번째 요소(
my_list[:1])와 나머지 부분을 재귀적으로 평탄화한 결과를 합쳐서 반환합니다. - 함수 외부에서 중첩 리스트를 하나 정의하고, 이를 콘솔에 출력합니다.
- 정의된 리스트를 인자로 넘겨
flatten_list함수를 호출한 뒤, 평탄화된 결과를 콘솔에 출력합니다.
참고 사항
위 방법은 로직이 직관적이라는 장점이 있지만, 슬라이싱(my_list[1:])이 호출될 때마다 새로운 리스트를 생성하기 때문에 데이터 크기가 클 경우 성능이 저하될 수 있습니다. 대용량 데이터를 다룰 때는 제너레이터(generator)나 itertools.chain을 활용한 반복(iterative) 방식이 더 효율적인 대안이 될 수 있습니다.