23.1 2차원 리스트를 만들고 요소에 접근하기
Unit 23. 2차원 리스트 사용하기
리스트를 사용할 때 한 줄로 늘어선 1차원 리스트를 사용했는데 이번에는 평면 구조의 2차원 리스트를 사용해보겠습니다.
2차원 리스트는 다음과 같이 가로×세로 형태로 이루어져 있으며 행(row)과 열(column) 모두 0부터 시작합니다.
23.1 2차원 리스트를 만들고 요소에 접근하기
2차원 리스트는 리스트 안에 리스트를 넣어서 만들 수 있으며 안쪽의 각 리스트는 ,(콤마)로 구분합니다.
- 리스트 = [[값, 값], [값, 값], [값, 값]]
그럼 숫자 2개씩 3묶음으로 리스트를 만들어보겠습니다.
>>> a = [[10, 20], [30, 40], [50, 60]] >>> a [[10, 20], [30, 40], [50, 60]]
가로 2, 세로 3의 2차원 리스트가 만들어졌습니다. 여기서는 리스트를 한 줄로 입력했지만 가로, 세로를 알아보기 쉽게 세 줄로 입력해도 됩니다.
a = [[10, 20], [30, 40], [50, 60] ]
23.1.1 2차원 리스트의 요소에 접근하기
2차원 리스트의 요소에 접근하거나 값을 할당할 때는 리스트 뒤에 [ ](대괄호)를 두 번 사용하며 [ ] 안에 세로(row) 인덱스와 가로(column) 인덱스를 지정해주면 됩니다.
- 리스트[세로인덱스][가로인덱스]
- 리스트[세로인덱스][가로인덱스] = 값
>>> a = [[10, 20], [30, 40], [50, 60]] >>> a[0] [0] # 세로 인덱스 0, 가로 인덱스 0인 요소 출력 10 >>> a[1][1] # 세로 인덱스 1, 가로 인덱스 1인 요소 출력 40 >>> a[2][1] # 세로 인덱스 2, 가로 인덱스 0인 요소 출력 60 >>> a[0][1] = 1000 # 세로 인덱스 0, 가로 인덱스 1인 요소에 값 할당 >>> a[0][1] 1000
2차원 리스트도 인덱스는 0부터 시작합니다. 따라서 리스트의 가로 첫 번째, 세로 첫 번째 요소는 a[0][0]이 됩니다.
2차원 리스트 [[10, 20], [30, 40], [50, 60]]은 가로 크기가 일정한 사각형 리스트입니다. 특히 파이썬에서는 가로 크기가 불규칙한 톱니형 리스트(jagged list)도 만들 수 있습니다.
a = [[10, 20], [500, 600, 700], [9], [30, 40], [8], [800, 900, 1000]]
리스트 a는 가로 크기(행의 요소 개수) 가 제각각입니다. 이런 리스트는 요소가 배치된 모양이 톱니처럼 생겼다고 하여 톱니형 리스트라고 부릅니다.
톱니형 리스트는 다음과 같이 append 메서드 등을 사용하여 동적으로 생성할 수도 있습니다.
>>> a = [] >>> a.append([]) >>> a[0].append(10) >>> a[0].append(20) >>> a.append([]) >>> a[1].append(500) >>> a[1].append(600) >>> a[1].append(700) >>> a [[10, 20], [500, 600, 700]]
2차원 리스트가 있으면 2차원 튜플도 있겠죠? 다음과 같이 튜플 안에 튜플을 넣는 방식, 튜플 안에 리스트를 넣는 방식, 리스트 안에 튜플을 넣는 방식 등이 가능합니다.
튜플 = ((값, 값), (값, 값), (값, 값))
튜플 = ([값, 값], [값, 값], [값, 값])
리스트 = [(값, 값), (값, 값), (값, 값)]
a = ((10, 20), (30, 40), (50, 60)) # 튜플 안에 튜플을 넣은 2차원 튜플 b = ([10, 20], [30, 40], [50, 60]) # 튜플 안에 리스트를 넣음 c = [(10, 20), (30, 40), (50, 60)] # 리스트 안에 튜플을 넣음
튜플은 내용을 변경할 수 없으므로 a는 안쪽과 바깥쪽 모두 요소를 변경할 수 없습니다. b는 안쪽 리스트만 요소를 변경할 수 있고, c는 바깥쪽 리스트만 요소를 변경할 수 있습니다.
a[0][0] = 500 # 안쪽 튜플은 변경할 수 없음. TypeError 발생 a[0] = (500, 600) # 바깥쪽 튜플은 변경할 수 없음. TypeError 발생 b[0][0] = 500 # 안쪽 리스트는 변경할 수 있음 b[0] = (500, 600) # 바깥쪽 튜플은 변경할 수 없음. TypeError 발생 c[0][0] = 500 # 안쪽 튜플은 변경할 수 없음. TypeError 발생 c[0] = (500, 600) # 바깥쪽 리스트는 변경할 수 있음
2차원 리스트를 출력하면 한 줄로 쭉 붙어서 출력됩니다.
>>> a = [[10, 20], [30, 40], [50, 60]] >>> a [[10, 20], [30, 40], [50, 60]]
만약 2차원 리스트의 사각형 구조를 유지하도록 출력하려면 pprint 모듈의 pprint 함수를 사용합니다.
>>> from pprint import pprint >>> pprint(a, indent=4, width=20) [ [10, 20], [30, 40], [50, 60]]
indent는 들여쓰기 칸 수, width는 가로 폭입니다. 각자 상황에 맞게 들여쓰기 칸 수와 가로 폭을 조절해서 사용해보세요.