Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python 리스트에서 연속 요소 쌍 만들기: 인덱스·range부터 zip·map까지 완벽 정리

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, ...)으로 변환해 주면 됩니다.