STUDY/Python

Python의 Zip 함수를 활용한 2차원 배열 전환 방법

칼코
반응형

 

 

 

 

 

시작하기에 앞서, zip 함수란?

Python에서 사용되는 내장 함수 중 하나로, 여러 개의 순회 가능한(iterable) 객체를 받아

각 객체에서 동일한 인덱스의 요소들을 묶어 튜플로 반환하는 역할을 한다. 아래는 예제다.

numbers = [1, 2, 3, 4]
letters = ["a", "b", "c", "d"]
zipped = zip(numbers, letters)

for z in zipped:
    print(z)

 

결과)

 

위의 결과를 보면, zip() 함수가 각 리스트의 같은 인덱스에 있는 요소들을 묶어서 튜플로 만들어 반환했음을 알 수 있다.

이렇게 함으로써 우리는 두 리스트를 한 번에 처리할 수 있다.

 

위의 예제는 단순히 두 개의 리스트를 zip() 함수로 묶은 것이지만, zip() 함수는 두 개 이상의 순회 가능한 객체를 받을 수 있으며, 요소들을 묶어준다. 이를 통해 여러 개의 리스트나 다른 순회 가능한 객체를 함께 처리할 수 있다.


zip 함수로 행과 열 바꾸는 방법

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

transposed_matrix = list(zip(*matrix))
print(transposed_matrix)

 

결과)

 

여기서 *matrix는 matrix 리스트를 unpack 하여 각 행을 개별적인 인자로 전달하는 역할을 한다.

그리고 zip() 함수는 각 행의 같은 인덱스의 요소들을 묶어서 튜플로 반환한다.

이를 다시 list()로 묶어주면 우리가 원하는 형태의 2차원 배열이 되는 것이다.

 

하지만 나는 리스트 내부의 요소들을 튜플이 아닌 리스트로 만들고 싶다!

😵 어떻게?

코드를 아래와 같이 조금만 수정해주면 된다.

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

# transposed_matrix = list(zip(*matrix))
transposed_matrix = list(map(list, zip(*matrix)))
print(transposed_matrix)

 

결과)

 

map() 함수도 활용하여 튜플이 아닌 리스트로 이뤄진 2차원 배열을 완성할 수 있었다.

 

1. zip(*matrix)

먼저, *matrix는 matrix의 각 행을 개별적인 인자로 전달.

따라서 zip(*matrix)는 각 행의 같은 인덱스에 있는 요소들을 묶어

튜플로 만들게 되고 이렇게 함으로써 열이 행으로 변환된다.

 

2. map(list, ...)

map() 함수는 함수를 적용하여 순회 가능한(iterable) 객체의 각 요소에 함수를 적용한 결과를 반환한다.

여기서는 list 함수를 각 튜플에 적용하여 튜플리스트로 변환한다.

 

3. list(...)

마지막으로, map() 함수의 결과는 이터레이터(iterator)이므로 이를 리스트로 변환하여 최종 결과를 얻게 된다.


마무리

코딩 테스트 문제를 풀다 보면 2차원 배열의 행과 열을 바꿔야 할 때가 종종 있다. 
그래서 오늘 zip() 함수에 대해 정리하면서 글로 기록하게 되었다.

앞으로도 코딩 관련 지식들을 블로그에 자주 정리하도록 노력해야겠다.

 

 

 

 

 

반응형