2차원 리스트는 리스트 안에 리스트를 넣어서 만들 수 있고, 안쪽의 각 리스트는 콤마로 구분한다.
a = [[10,20],[30,40],[50,60]]
print(a)
[[10, 20], [30, 40], [50, 60]]
a = [[10, 20], # 가독성을 위해 세 줄로 입력을 해도 된다.
[30, 40],
[50, 60] ]
2차원 리스트의 요소에 접근하거나 값을 할당할 때에는 를 두번 사용하면 된다. 그리고 안의 []안에 세로 인덱스와 가로 인덱스를 지정해주면 된다.
a = [[10, 20], [30, 40], [50, 60]]
a[0][0] # 세로 인덱스 0, 가로 인덱스 0
10
a[1][1] # 세로 인덱스 1, 가로 인덱스 1
40
a[0][0] = 1000
print(a[0][0]) == 1000
2차원 배열을 알아보기 쉽게 출력하려면 pprint를 사용해야 한다.
from pprint import pprint
pprint(a, indent = 4, width = 20) #indent는 들여쓰기 칸 수 width는 가로 폭이다.
a = [[10, 20], [30, 40], [50, 60]]
for x,y in a:
print(x,y)
10 20
30 40
50 60
for 반복문을 한 번만 사용하는 방식
for 반복문을 한 번만 사용하는 방식은 2차원 리스트의 가로 크기가 크지 않을 때 유용하다.
a = [[10, 20], [30, 40], [50, 60]]
for i in a:
for j in i:
print(j, end= ' ')
print()
10 20
30 40
50 60
for 반복문을 두 번 사용하는 방식 처음 a에서 내부의 리스트를 한 개씩 꺼내오고 a에서 꺼내온 리스트 안쪽의 요소를 j로 꺼내온다.
a = [[10, 20], [30, 40], [50, 60]]
for i in range(len(a)): # 가로크기
for j in range(len(a[i])): # 세로크기
print(a[i][j], end = ' ')
print()
10 20
30 40
50 60
for range에 세로 크기와 가로 크기를 넣으면 인덱스로 사용할 수 있다. 주의할 점은 len으로 2차원 리스트 a의 크기를 구하면 리스트 안에 들어있는 모든 요소의 개수가 아니라 안쪽 리스트의 개수(세로 크기)가 나온다. 즉 len(a) 는 3이 나온다. 안쪽리스트의 len(a[i])의 크기는 2이다.
a = [[10, 20], [30, 40], [50, 60]]
i = 0
while i < len(a) :
x, y = a[i]
print(x, y)
i += 1
10 20
30 40
50 60
a = []
for i in range(3):
line = [] # 안쪽 리스트에서 사용할 빈 리스트 생성
for j in range(2):
line.append(0) # 안쪽 리스트에 요소 0 추가
a.append(line) # 전체 리스트에 안쪽 리스트 line 추가
print(a)
[[0, 0], [0, 0], [0, 0]]
a = [[0 for j in range(2)] for i in range(3)]
print(a)
[[0,0],[0,0],[0,0]]
a = [[0]* 2 for i in range(3)]
print(a)
[[0,0],[0,0],[0,0]]
0 for j in range(2)로 [0,0] 리스트를 생성한 이후 for i in range(3)을 통해 3번 반복하여
[[0,0],[0,0],[0,0]]를 만들어 준다.
a = [3,1,3,2,5] # 가로의 크기를 저장한 리스트
b = [] # 빈 리스트
for i in a: # 가로 크기를 저장한 a리스트로 반복
line = [] # 안쪽 리스트로 사용될 빈 리스트
for j in range(i): # 리스트 a에 저장된 가로 크기만큼 반복
line.append(0)
b.append(line) # 리스트 b에 안쪽 리스트를 추가
print(b)
[[0, 0, 0], [0], [0, 0, 0], [0, 0], [0, 0, 0, 0, 0]]
# 리스트 표현식으로 만들어보기
a = [[0] * i for i in [3,1,3,2,5]]
print(a)
[[0, 0, 0], [0], [0, 0, 0], [0, 0], [0, 0, 0, 0, 0]]
2차원 리스트를 생성한 뒤에 다른 변수에 할당하고 요소를 변경하면 두 리스트에 모두 반영된다.
a = [[10,20], [30,40]]
b = a
b[0][0] = 500
print(a)
print(b)
[[500, 20], [30, 40]]
[[500, 20], [30, 40]]
copy 메서드를 사용해 복사를 해도 모두 반영되는 것을 알 수 있다.
a = [[10,20], [30,40]]
b = a.copy()
b[0][0] = 500
print(a)
print(b)
[[500, 20], [30, 40]]
[[500, 20], [30, 40]]
그렇다면 어떤 메서드를 사용해야할까? 바로 deepcopy함수를 이용해야 한다.
a = [[10, 20], [30, 40]]
import copy
b = copy.deepcopy(a)
b[0][0] = 500
print(a)
print(b)
[[10, 20], [30, 40]]
[[500, 20], [30, 40]]
# deepcopy는 튜플에도 사용이 가능하다.