재귀(recursion) 기법을 사용하지 않고 중첩된 리스트를 평탄화(flatten)해야 하는 경우, 람다(lambda) 함수와 함께 sum, map, isinstance 메서드를 활용하면 간결하게 해결할 수 있습니다.
핵심 개념 정리
먼저 이 예제에 사용되는 주요 개념들을 살펴보겠습니다.
1. 리스트(List)
파이썬의 리스트는 이기종(heterogeneous) 값을 저장할 수 있는 자료구조입니다. 즉, 정수, 실수, 문자열 등 서로 다른 데이터 타입의 값들을 하나의 리스트에 담을 수 있습니다.
2. isinstance() 메서드
isinstance() 메서드는 주어진 객체가 특정 데이터 타입에 속하는지 여부를 검사하여 참(True) 또는 거짓(False)을 반환합니다. 이 예제에서는 해당 요소가 리스트인지 판별하는 데 사용됩니다.
3. 람다(Lambda) 함수
익명 함수(anonymous function)는 이름 없이 정의되는 함수를 의미합니다. 일반적으로 파이썬 함수는 def 키워드로 정의하지만, 익명 함수는 lambda 키워드를 사용하여 정의합니다. 람다 함수는 하나의 표현식만 가질 수 있지만, 인자는 원하는 만큼 여러 개 받을 수 있으며, 표현식의 실행 결과를 반환합니다.
4. map() 함수
map() 함수는 지정된 함수나 연산을 반복 가능한(iterable) 객체(리스트, 튜플 등)의 모든 항목에逐一 적용하고, 그 결과를 반환합니다.
5. sum() 메서드
sum() 메서드는 반복 가능한 객체 내부의 숫자 값들을 모두 더한 결과를 반환합니다. 이 예제에서는 리스트들을 하나로 합치는 데 활용됩니다.
예제 코드
아래는 재귀 없이 중첩 리스트를 평탄화하는 전체 코드입니다.
my_list = [[[11,[[32]],[[[53]]]],[[64],75]], [[6, 89, 99]]]
flattened_list = lambda my_list: sum(map(flattened_list,my_list),[]) if isinstance(my_list,list) else [my_list]
print("원본 리스트 : ")
print(my_list)
print("평탄화된 리스트 :")
print(flattened_list(my_list))실행 결과
원본 리스트 : [[[11, [[32]], [[[53]]]], [[64], 75]], [[6, 89, 99]]] 평탄화된 리스트 : [11, 32, 53, 64, 75, 6, 89, 99]
코드 설명
- 깊게 중첩된 리스트를 정의하고, 콘솔에 출력합니다.
- 람다 함수 내부에서
isinstance()로 요소가 리스트인지 확인한 후, 리스트라면map()으로 각 요소에 동일한 평탄화 로직을 적용하고sum()으로 결과를 하나의 리스트로 병합합니다. - 리스트가 아니라면 해당 값을 그대로 리스트로 감싸 반환합니다.
- 이 과정은 람다 함수가 자기 자신을 호출하는 형태로 구현되어, 재귀 함수를 명시적으로 정의하지 않고도 중첩 구조 전체를 처리할 수 있습니다.
- 최종 결과를 변수에 할당한 후 콘솔에 출력합니다.
참고: 다른 평탄화 방법
재귀 대신 사용할 수 있는 또 다른 방법으로는 itertools.chain이나 리스트 컴프리헨션(list comprehension)이 있습니다. 다만 위 예제처럼 깊이가 불규칙하게 중첩된 리스트를 처리하려면, 람다 함수를 활용한 자기 호출 방식이 가장 유연하고 코드도 간결하다는 장점이 있습니다.