파이썬에서 리스트나 튜플의 인접한 요소들을 서로 곱해야 하는 경우, zip 함수와 tuple 함수, 그리고 제너레이터 표현식을 함께 사용하면 아주 간단하게 해결할 수 있습니다.
zip 함수는 여러 개의 반복 가능한(iterable) 객체를 인자로 받아, 각 객체에서 같은 위치에 있는 요소들을 하나의 튜플로 묶어주는 역할을 합니다.
제너레이터(generator)는 이터레이터를 손쉽게 만들 수 있는 방법입니다. __iter__()와 __next__() 메서드가 구현된 클래스를 자동으로 생성하고 내부 상태를 추적하며, 더 이상 반환할 값이 없을 때는 StopIteration 예외를 발생시킵니다.
아래는 실제 동작을 보여주는 예제입니다.
예제
my_tuple_1 = (7, 8, 0, 3, 45, 3, 2, 22)
print("The tuple is : ")
print(my_tuple_1)
my_result = tuple(i * j for i, j in zip(my_tuple_1, my_tuple_1[1:]))
print("The tuple after multiplication is : ")
print(my_result)
출력
The tuple is : (7, 8, 0, 3, 45, 3, 2, 22) The tuple after multiplication is : (56, 0, 0, 135, 135, 6, 44)
설명
- 튜플을 정의한 뒤 콘솔에 출력합니다.
- 원본 튜플과 첫 번째 요소를 제외한 동일한 튜플을
zip으로 묶어 순회하면서, 대응되는 요소들을 서로 곱합니다. - 곱셈 결과를 변수에 저장합니다.
- 최종 결과를 콘솔에 출력합니다.
작동 원리
여기서 핵심은 zip(my_tuple_1, my_tuple_1[1:]) 부분입니다. 슬라이싱 [1:]을 통해 첫 번째 요소를 건너뛴 튜플을 만들고, 이를 원본 튜플과 짝지으면 (7, 8), (8, 0), (0, 3)처럼 인접한 두 요소의 쌍이 차례대로 생성됩니다. 제너레이터 표현식이 각 쌍을 곱하므로, 최종적으로 인접 요소들의 곱으로만 이루어진 새로운 튜플을 얻게 됩니다. 참고로 입력 튜플의 길이가 n이라면 결과 튜플의 길이는 n-1이 됩니다.