튜플의 뺄셈, 어떻게 처리할까?
파이썬에서 튜플(tuple)은 불변(immutable) 자료형이기 때문에 리스트처럼 요소를 직접 수정하거나 산술 연산자로 뺄셈을 수행할 수 없습니다. 그렇다면 여러 개의 튜플이 하나의 튜플 안에 들어 있는 구조, 즉 '튜플의 튜플'에서 각 내부 튜플의 요소에 뺄셈을 적용하려면 어떻게 해야 할까요? 가장 직접적인 방법은 반복문과 제너레이터 표현식을 활용하는 것입니다.
예제
예를 들어 다음과 같은 튜플의 튜플이 있다고 가정해 보겠습니다.
((0, 1, 2), (3, 4, 5), (6, 7, 8), (9, 10, 11), (12, 13, 14))
각 내부 튜플에서 (1, 2, 3, 4, 5)의 대응하는 값을 빼고 싶다면 아래와 같이 작성할 수 있습니다.
my_tuple = ((0, 1, 2), (3, 4, 5), (6, 7, 8), (9, 10, 11), (12, 13, 14)) sub = (1, 2, 3, 4, 5) tuple(tuple(x - sub[i] for x in my_tuple[i]) for i in range(len(my_tuple)))
출력 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
((-1, 0, 1), (1, 2, 3), (3, 4, 5), (5, 6, 7), (7, 8, 9))
동작 원리 살펴보기
바깥쪽 제너레이터 표현식은 인덱스 i를 이용해 각 내부 튜플을 순회하고, 안쪽 제너레이터 표현식은 해당 튜플의 모든 요소 x에서 sub[i] 값을 뺍니다. 즉, 첫 번째 내부 튜플의 모든 요소에서는 1을, 두 번째에서는 2를 빼는 식으로 진행됩니다. 마지막으로 tuple() 함수가 제너레이터를 튜플로 변환하여 최종 결과를 완성합니다.
마무리
이처럼 튜플은 불변 자료형이지만, 제너레이터 표현식과 tuple() 함수를 조합하면 새로운 튜플을 손쉽게 생성하면서 요소 단위 연산을 처리할 수 있습니다. 행렬 연산처럼 더 복잡한 계산이 필요하다면 NumPy 배열로 변환하는 방법도 함께 고려해 보시기 바랍니다.