리스트 안에 중첩된 튜플 구조를 하나의 튜플로 평탄화(flatten)해야 하는 경우가 있습니다. 이럴 때 튜플을 입력값으로 받는 재귀 함수를 정의하면 간단하게 해결할 수 있습니다.
함수는 전달받은 튜플을 순회하면서, 더 이상 분해할 수 없는 요소에 도달할 때까지 자기 자신을 반복적으로 호출하여 최종 결과를 만들어냅니다.
아래는 실제 동작 예시입니다.
예제 코드
def flatten_tuple(my_tuple):
if isinstance(my_tuple, tuple) and len(my_tuple) == 2 and not isinstance(my_tuple[0], tuple):
my_result = [my_tuple]
return tuple(my_result)
my_result = []
for sub in my_tuple:
my_result += flatten_tuple(sub)
return tuple(my_result)
my_tuple = ((35, 46), ((67, 70), (8, 11), (10, 111)), (((21, 12), (3, 4))))
print("The tuple is : " )
print(my_tuple)
my_result = flatten_tuple(my_tuple)
print("The flattened tuple is : ")
print(my_result)실행 결과
The tuple is : ((35, 46), ((67, 70), (8, 11), (10, 111)), ((21, 12), (3, 4))) The flattened tuple is : ((35, 46), (67, 70), (8, 11), (10, 111), (21, 12), (3, 4))
코드 설명
'flatten_tuple'이라는 이름의 함수를 정의하고, 매개변수로 튜플을 받습니다.
먼저 해당 값이 실제 튜플인지, 그리고 길이가 2인지 확인합니다.
두 조건을 모두 만족하면 더 이상 분해할 필요가 없으므로 그대로 반환합니다.
그렇지 않은 경우에는 빈 리스트를 하나 생성합니다.
튜플의 각 하위 요소를 순회하면서 함수를 재귀 호출하고, 평탄화된 결과를 리스트에 누적합니다.
모든 순회가 끝나면 리스트를 튜플로 변환하여 최종 결과로 반환합니다.
함수 외부에서 중첩된 튜플을 하나 정의한 뒤 콘솔에 출력합니다.
정의한 함수에 이 튜플을 인자로 전달하여 호출합니다.
평탄화된 결과가 콘솔에 출력됩니다.
참고 사항
재귀 방식 외에도 yield from 문법을 활용한 제너레이터 기반 접근이나, 반복문과 스택을 이용한 비재귀 방식으로도 중첩 튜플을 평탄화할 수 있습니다. 데이터의 깊이가 매우 깊다면 Python의 재귀 호출 한도(recursion limit)에 유의하는 것이 좋습니다.