Python으로 데이터 분석을 하다 보면 리스트의 연속된 요소들을 쌍(pair)으로 묶어야 하는 경우가 자주 발생합니다. 예를 들어 시계열 데이터에서 이전 값과 현재 값을 비교하거나, 순차적인 데이터 간의 관계를 분석할 때 유용하게 활용됩니다.
이 글에서는 Python 리스트에서 연속 요소를 쌍으로 묶는 대표적인 두 가지 방법을 예제 코드와 함께 자세히 살펴보겠습니다.
방법 1: 인덱스와 range 함수 활용
가장 직관적인 방법은 리스트 컴프리헨션(list comprehension) 안에서 인덱스 i와 i+1을 함께 사용하는 것입니다. range 함수에 len(listA) - 1을 전달하면 마지막 요소에서 인덱스를 벗어나지 않도록 반복 횟수를 정확히 제한할 수 있습니다.
예제 코드
listA = [51,23,11,45]
# 주어진 리스트
print("Given list A: ", listA)
# 연속 요소 쌍 생성
res = [[listA[i], listA[i + 1]]
for i in range(len(listA) - 1)]
# 결과 출력
print("The list with paired elements: \n",res)실행 결과
위 코드를 실행하면 다음과 같은 결과를 얻을 수 있습니다.
Given list A: [51, 23, 11, 45] The list with paired elements: [[51, 23], [23, 11], [11, 45]]
리스트 [51, 23, 11, 45]에서 인접한 두 요소씩 묶여 [51, 23], [23, 11], [11, 45]라는 세 개의 쌍이 생성된 것을 확인할 수 있습니다. 요소가 n개인 리스트는 항상 n-1개의 연속 쌍을 가지게 됩니다.
방법 2: map과 zip 함수 활용
조금 더 Python다운 방식으로는 zip과 map 함수 그리고 슬라이싱(slicing)을 조합할 수 있습니다. 원본 리스트와 첫 번째 요소를 제외한 리스트(listA[1:])를 zip으로 묶으면 자동으로 연속 요소들이 짝지어지고, map(list, ...)을 통해 각 튜플을 리스트로 변환합니다.
예제 코드
listA = [51,23,11,45]
# 주어진 리스트
print("Given list A: ", listA)
# zip과 map 활용
res = list(map(list, zip(listA, listA[1:])))
# 결과 출력
print("The list with paired elements: \n",res)실행 결과
위 코드 역시 동일한 결과를 출력합니다.
Given list A: [51, 23, 11, 45] The list with paired elements: [[51, 23], [23, 11], [11, 45]]
두 방법 비교 및 추가 팁
두 방법 모두 같은 결과를 내지만 상황에 따라 선택 기준이 달라질 수 있습니다.
- 인덱스 + range 방식: 로직이 명시적이라 초보자가 이해하기 쉽고, 특정 조건(예: 홀수 인덱스만)을 추가하기 용이합니다.
- zip + map 방식: 코드가 간결하고 실행 속도 면에서도 일반적으로 유리하며, 대용량 데이터 처리 시 itertools.pairwise(Python 3.10 이상)로 대체하면 더욱 효율적입니다.
참고로 Python 3.10부터는 표준 라이브러리 itertools에 pairwise 함수가 포함되어 있어 list(itertools.pairwise(listA)) 한 줄로도 동일한 작업을 수행할 수 있습니다. 다만 이 경우 결과가 튜플 형태로 반환되므로, 리스트 형태가 필요하다면 map(list, ...)으로 변환해 주면 됩니다.