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

파이썬에서 여러 리스트의 같은 인덱스 요소를 하나로 묶는 방법

이 튜토리얼에서는 서로 다른 여러 리스트에서 같은 인덱스에 위치한 요소들을 모아 새로운 리스트로 만드는 프로그램을 작성해 보겠습니다. 단, 한 가지 조건이 있습니다. 모든 리스트의 길이가 동일해야 한다는 점입니다.

먼저 예시를 통해 문제를 더 명확하게 이해해 보겠습니다.

입력 예시

[[1, 2, 3], [4, 5, 6], [7, 8, 9]]

출력 결과

[[1, 4, 7], [2, 5, 8], [3, 6, 9]]

즉, 각 리스트의 0번째 요소들(1, 4, 7)끼리, 1번째 요소들(2, 5, 8)끼리, 2번째 요소들(3, 6, 9)끼리 묶이게 됩니다. 이 문제는 여러 가지 방법으로 해결할 수 있는데, 하나씩 살펴보겠습니다.

방법 1: 일반 반복문 사용하기

가장 기본적인 방법은 중첩 반복문을 활용하는 것입니다. 알고리즘의 흐름은 다음과 같습니다.

  • 리스트 안에 리스트가 들어 있는 형태로 데이터를 초기화합니다.
  • 결과를 담을 빈 리스트를 준비합니다.
  • 인덱스를 추적할 변수를 0으로 초기화합니다.
  • 서브 리스트의 길이만큼 반복하면서
    • 결과 리스트에 빈 서브 리스트를 추가하고,
    • 각 리스트의 길이만큼 반복하며 해당 인덱스의 요소를 결과에 추가합니다.
  • 최종 결과를 출력합니다.

예제 코드

# 리스트 초기화
lists = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
# 결과를 담을 빈 리스트
result = []
# 인덱스 변수를 0으로 초기화
index = 0
# 서브 리스트의 길이(3)만큼 반복
for i in range(len(lists[0])):
    # 결과에 빈 서브 리스트 추가
    result.append([])
    # 리스트 개수(3)만큼 반복
    for j in range(len(lists)):
        # 해당 인덱스의 요소를 결과에 추가
        result[index].append(lists[j][index])
    # 다음 인덱스로 이동
    index += 1
# 결과 출력
print(result)

실행 결과

위 코드를 실행하면 다음과 같은 결과를 얻을 수 있습니다.

[[1, 4, 7], [2, 5, 8], [3, 6, 9]]

코드가 의도대로 동작하지만, 반복문이 중첩되어 있어 다소 복잡해 보입니다. 파이썬에는 이 작업을 훨씬 간단하게 처리해 주는 도구가 있습니다.

방법 2: zip 함수 활용하기

zip 함수를 사용하면 별도의 노력 없이 원하는 결과를 얻을 수 있습니다. zip 함수는 여러 iterable에서 같은 인덱스의 요소들을 튜플(tuple) 형태로 묶어 주기 때문입니다.

예제 코드

# 리스트 초기화
lists = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
# zip 함수로 묶어서 출력
print(list(zip(*lists)))

실행 결과

[(1, 4, 7), (2, 5, 8), (3, 6, 9)]

여기서 *lists는 언패킹(unpacking) 연산자로, 리스트 안의 각 서브 리스트를 zip 함수에 개별 인자로 전달하는 역할을 합니다. 결과가 튜플의 리스트로 반환되었는데, 만약 리스트의 리스트 형태가 필요하다면 어떻게 해야 할까요?

방법 3: zip과 map을 함께 사용하기

튜플을 리스트로 변환하는 가장 깔끔한 방법은 map 함수를 활용하는 것입니다. 딱 한 줄의 코드로 해결됩니다.

예제 코드

# 리스트 초기화
lists = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
# zip과 map을 조합하여 출력
print(list(map(list, zip(*lists))))

실행 결과

[[1, 4, 7], [2, 5, 8], [3, 6, 9]]

여기서 map 함수는 zip의 결과인 각 튜플을 순회하면서 list() 생성자를 적용하여 튜플을 리스트로 변환합니다. 물론 이 변환 작업도 반복문으로 직접 구현할 수 있으니, 연습 삼아 직접 작성해 보는 것도 좋습니다.

마무리

정리하면, 여러 리스트에서 같은 인덱스의 요소를 묶는 작업은 반복문으로 직접 구현할 수도 있지만, zipmap을 조합하면 단 한 줄로 간결하게 해결할 수 있습니다. 실무에서는 후자의 방식이 가독성과 유지보수 측면에서 더 권장됩니다. 튜토리얼 내용에 대해 궁금한 점이 있다면 댓글로 남겨주세요.