[Python] 2차원 리스트 회전시키기

2nd List Rotate

Python의 내장함수 (unpack , zip ) 를 이용해서 2차원 list를 회전시킬 수 있습니다.

pack / unpack

Python은 * 혹은 ** 를 이용하여 container type data를 pack / unpack 할 수 있습니다. tuple, list의 경우 * 를, dict의 경우 ** 를 사용합니다.

packing 은 여러개의 객체를 하나의 객체로 합쳐줍니다.

* 를 붙인 매개변수에 하나 혹은 여러개의 객체가 들어올 경우 해당 객체들은 packing 되어 저장됩니다.

def testFunc(*num):
  print(num)
testFunc(5, 6, 7)
# 결과 : (5, 6, 7)

unpacking 은 여러개의 객체를 포함하고 있는 하나의 객체를 풀어줍니다. 여러개의 객체를 * 를 붙여서 매개변수로 전달하면 해당 객체들은 unpack 되어 저장됩니다.

def testFunc(a, b, c, d):
  print(a, b, c, d)
testList = [5,6,7,8]
testFunc(*testList)
# 결과 : 5 6 7 8

이를 이용해서 2nd List 를 쉽게 출력할 수도 있습니다.

myMap = [[i*10+j for j in range(10)] for i in range(10)]
for m in myMap:
  print(*m)

# 결과
0 1 2 3 4 5 6 7 8 9
10 11 12 13 14 15 16 17 18 19
20 21 22 23 24 25 26 27 28 29
30 31 32 33 34 35 36 37 38 39
40 41 42 43 44 45 46 47 48 49
50 51 52 53 54 55 56 57 58 59
60 61 62 63 64 65 66 67 68 69
70 71 72 73 74 75 76 77 78 79
80 81 82 83 84 85 86 87 88 89
90 91 92 93 94 95 96 97 98 99

zip

zip(*iterable) 은 동일한 개수로 이루어진 iterable 자료형을 묶어줍니다.

testList = [[5,6],[7,8]]
print(list(zip(*testList)))
# 결과 : [(5, 7), (6, 8)]

위의 unpack과 함께 zip을 활용하여 2nd List 를 회전시킬 수 있습니다.

2차원 리스트를 unpack 하고 zip을 해주면 열이 행으로 가게되어 마치 오른쪽상단 끝과 왼쪽 하단 끝을 잡고 뒤집어준 것처럼 됩니다.

myMap = [[i*10+j for j in range(10)] for i in range(10)]
myMap = list(zip(*myMap))
for m in myMap:
  print(*m)

# 결과
0 10 20 30 40 50 60 70 80 90
1 11 21 31 41 51 61 71 81 91
2 12 22 32 42 52 62 72 82 92
3 13 23 33 43 53 63 73 83 93
4 14 24 34 44 54 64 74 84 94
5 15 25 35 45 55 65 75 85 95
6 16 26 36 46 56 66 76 86 96
7 17 27 37 47 57 67 77 87 97
8 18 28 38 48 58 68 78 88 98
9 19 29 39 49 59 69 79 89 99

이 상태에서 위아래로 뒤집어주면

myMap = myMap[::-1]
for m in myMap:
  print(*m)

# 결과
9 19 29 39 49 59 69 79 89 99
8 18 28 38 48 58 68 78 88 98
7 17 27 37 47 57 67 77 87 97
6 16 26 36 46 56 66 76 86 96
5 15 25 35 45 55 65 75 85 95
4 14 24 34 44 54 64 74 84 94
3 13 23 33 43 53 63 73 83 93
2 12 22 32 42 52 62 72 82 92
1 11 21 31 41 51 61 71 81 91
0 10 20 30 40 50 60 70 80 90

왼쪽으로 90도 돌린 셈이 되죠.

순서를 반대로해주면,

먼저 2차원 리스트를 reverse 해주면 다음과 같이 됩니다.

myMap = [[i*10+j for j in range(10)] for i in range(10)]
myMap = myMap[::-1]
for m in myMap:
  print(*m)

# 결과
90 91 92 93 94 95 96 97 98 99
80 81 82 83 84 85 86 87 88 89
70 71 72 73 74 75 76 77 78 79
60 61 62 63 64 65 66 67 68 69
50 51 52 53 54 55 56 57 58 59
40 41 42 43 44 45 46 47 48 49
30 31 32 33 34 35 36 37 38 39
20 21 22 23 24 25 26 27 28 29
10 11 12 13 14 15 16 17 18 19
0 1 2 3 4 5 6 7 8 9

이걸 unpack하여 zip 해주게 되면 각 열이 묶이게 되고, 다시 리스트로 만들어주면

myMap = [[i*10+j for j in range(10)] for i in range(10)]
myMap = list(zip*(myMap[::-1]))
for m in myMap:
  print(*m)

# 결과
90 80 70 60 50 40 30 20 10 0
91 81 71 61 51 41 31 21 11 1
92 82 72 62 52 42 32 22 12 2
93 83 73 63 53 43 33 23 13 3
94 84 74 64 54 44 34 24 14 4
95 85 75 65 55 45 35 25 15 5
96 86 76 66 56 46 36 26 16 6
97 87 77 67 57 47 37 27 17 7
98 88 78 68 58 48 38 28 18 8
99 89 79 69 59 49 39 29 19 9

오른쪽으로 90도 회전한 결과가 됩니다.

이처럼 unpackzip 을 활용해 2차원 리스트를 쉽게 회전시킬 수 있습니다.