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도 회전한 결과가 됩니다.
이처럼 unpack
과 zip
을 활용해 2차원 리스트를 쉽게 회전시킬 수 있습니다.
'SW > Python & Django' 카테고리의 다른 글
[Python] 객체지향프로그래밍 - OOP (Object Orientated Programming) (0) | 2021.06.14 |
---|---|
[Python] exe 파일 만들기 (PyInstaller) (0) | 2021.06.04 |
[Python] GIL (0) | 2021.05.31 |
[Django] admin 계정 관리(생성, P/W 찾기) (0) | 2021.04.11 |
[Python] 가상환경 (0) | 2021.03.26 |
Comment