Python 튜플에서 쌍별(Pairwise) 덧셈 구현하기
튜플의 인접한 요소들을 쌍으로 묶어 더해야 하는 경우, zip 메서드와 tuple 메서드, 그리고 제너레이터 표현식을 함께 활용하면 간단하게 처리할 수 있습니다.
zip 메서드는 여러 개의 이터러블(iterable)을 인자로 받아, 각 이터러블의 요소들을 하나씩 짝지어 튜플 형태로 집계한 뒤 그 결과를 반환합니다.
제너레이터(generator)는 이터레이터를 손쉽게 생성할 수 있는 방법입니다. 내부적으로 __iter__()와 __next__() 메서드가 구현된 클래스를 자동으로 만들어 주며, 내부 상태를 스스로 추적하고 더 이상 반환할 값이 없을 때는 StopIteration 예외를 발생시킵니다.
tuple 메서드는 주어진 이터러블을 튜플(tuple) 데이터 타입으로 변환하는 역할을 합니다.
아래 예제를 통해 실제 동작 과정을 확인해 보겠습니다.
예제 코드
my_tuple = (67, 45, 34, 56, 99, 123, 0, 56)
print("The tuple is : ")
print(my_tuple)
my_result = tuple(i + j for i, j in zip(my_tuple, my_tuple[1:]))
print("The tuple after addition is : ")
print(my_result)실행 결과
The tuple is : (67, 45, 34, 56, 99, 123, 0, 56) The tuple after addition is : (112, 79, 90, 155, 222, 123, 56)
코드 설명
- 먼저 튜플을 하나 생성한 뒤 콘솔에 출력합니다.
- 원본 튜플과 첫 번째 요소를 제외한 슬라이스(
my_tuple[1:])를 zip 메서드로 묶습니다. 이렇게 하면 인접한 두 요소끼리 순서대로 짝이 됩니다. - 제너레이터 표현식을 사용해 각 쌍의 값을 더하고, 그 결과를 tuple 메서드로 변환하여 변수에 할당합니다.
- 마지막으로 해당 변수를 콘솔에 출력합니다.
핵심은 zip(my_tuple, my_tuple[1:]) 부분입니다. 원본 튜플과 한 칸씩 앞당겨진 튜플을 나란히 묶으면 (67, 45), (45, 34), (34, 56)처럼 인접 요소의 쌍이 만들어지며, 이를 모두 더하면 결과 튜플의 길이는 원본보다 하나 작아집니다.