중첩 리스트(nested list)란 요소 자체가 리스트로 구성된 리스트를 의미합니다. Python에서 데이터가 중첩 리스트 형태로 저장되어 있을 때, 각 요소를 개별적으로 처리하려면 이를 하나의 평탄한(flattened) 1차원 리스트로 변환해야 하는 경우가 자주 발생합니다.
문제는 내부 요소 역시 또 다른 리스트로 중첩되어 있을 수 있고, 그 중첩이 몇 단계든 깊어질 수 있다는 점입니다. 따라서 이 문제는 재귀(recursion)를 활용해 해결하는 것이 가장 효과적입니다. 각 요소가 리스트인지 계속 검사하고, 리스트라면 동일한 함수를 반복 호출하여 더 깊은 곳까지 탐색합니다. 더 이상 리스트가 아닌 요소를 만나면 결과 리스트에 추가하는 방식으로, 최종적으로 모든 요소가 중첩 없이 담긴 새로운 리스트를 얻을 수 있습니다.
예제 코드
listA = [[43, [0]],12, 19, [13,[8, 8]], 21 ]
print('주어진 중첩 리스트: \n', listA)
# 평탄화된 리스트를 담을 변수
res = []
# 재귀 함수 정의
def flatlist(l):
for x in l:
if type(x) == list:
flatlist(x)
else:
res.append(x)
flatlist(listA)
print('생성된 평탄화 리스트: \n', res)실행 결과
위 코드를 실행하면 다음과 같은 결과를 확인할 수 있습니다.
주어진 중첩 리스트: [[43, [0]], 12, 19, [13, [8, 8]], 21] 생성된 평탄화 리스트: [43, 0, 12, 19, 13, 8, 8, 21]
코드 동작 원리
함수 flatlist()는 입력받은 리스트의 각 요소를 순회합니다. 요소가 리스트 타입이라면 자기 자신을 다시 호출하여 해당 내부 리스트를 탐색하고, 리스트가 아니라면 res 리스트에 추가합니다. 이 과정 덕분에 중첩 깊이와 관계없이 모든 요소를 빠짐없이 추출할 수 있습니다.
참고: isinstance() 사용하기
type(x) == list 대신 isinstance(x, list)를 사용하면 서브클래스까지 포함해 더 안전하게 타입을 검사할 수 있어 Python 공식 스타일 가이드에서도 권장됩니다.