시작하기에 앞서, 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() 함수에 대해 정리하면서 글로 기록하게 되었다.
앞으로도 코딩 관련 지식들을 블로그에 자주 정리하도록 노력해야겠다.