알고리즘/알고리즘 개념

[python]이차원 배열을 뒤집는 방법_zip(*list)

개발자 덕구🐾 2022. 8. 3. 17:14
728x90

 

 

 

알고리즘을 풀다보면 이차원 배열을 뒤집어야하는 문제가 가끔 나온다.

그럴때마다 그때 그때 이해해서 적었지만 이것을 정리하고 싶어서 글을 쓴다. 

 

 

 

 

 

1.  " * " 

python에서 아스트리크(*)은  unpack역할을 한다.

 

첫줄은 이차원 배열 , 두번째 줄은 이차원 배열에서 *를 한 결과이다. 

첫줄은 각 리스트들이 하나의 리스트로 연결되어있지만 

두번째 줄은 리스트들이 unpack된것을 확인할 수 있다.

 

 

 

2. zip()

 

zip은 iterable한 것들을 엮어준다. 

지퍼를 올리는 것처럼 양측의 데이터를 짝을 지어준다. 

zip의 예시,  출처 : https://www.daleseo.com/python-zip/

 

 

 

 


 

 

 

 아스트리크(*)와 zip을 함께 사용하면? 무슨 일이 일어날까?

 

a = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
print(zip(*a))
print(list(zip(*a)))

일단 첫줄을 실행하면 zip type으로 반환되기 때문에 <zip object at 0x000001B1B38AE400> 이런식으로 출력된다.

list와 같은 형식으로 감싸주어야 우리가 원하는 대로 출력할 수 있다. 

 

 

둘째줄의 실행 결과는 

[(1, 5, 9), (2, 6, 10), (3, 7, 11), (4, 8, 12)] 이다. 

이차원 배열을 열끼리 묶어 하나의 리스트로 만든 이차원 튜플형태가 된다. 

 

그 이유는  아래 코드처럼 각각 리스트로 나누어 zip을 실행되기 때문이다. 

    num = [1,2,3,4]
    num2 = [5,6,7,8]
    num3 = [9,10,11,12]
    print(list(zip(num,num2,num3)))

* 을 통해서 a에 있는 각 리스트들을 unpack하고 zip을 통해서 index가 동일한 것끼리 묶는다. 

 

 

 

 

 

 

그래서 이를 통해 행과 열을 바꿀 수 있는 것이다. 

 

0행 0열 -> 0행 0열 

1행 0열 -> 0행 1열 

2행 0열 -> 0행 2열 

....

 

 

 

 

 

 

출처 :&nbsp;https://stackoverflow.com/questions/29139350/difference-between-ziplist-and-ziplist

 

반응형