2차원 리스트란 리스트 내에 리스트가 있는걸 뜻한다.
a = [[1,2,3],[4,5,6],[7,8,9]]
a
[[1,2,3],
[4,5,6],
[7,8,9]]
#설명이 편하게 리스트를 세로로 표현
[1,2,3], [4,5,6],[7,8,9] 라는 리스트가 빈리스트([])안에 되어있다.
아래의 세로로 배열한 리스트를 아래의 표를 대입 시켜본다면
가로축을 행,세로축을 열로 볼 수 있다.
2차원 리스트의 요소에 접근하기
먼저 요소에 접근하기위해서는 index를 사용해준다
- 리스트[세로인덱스][가로인덱스]
a =
[[1,2,3],
[4,5,6],
[7,8,9]]
a[0][0] #0열 0행
1
a[1][1] #1열 1행
5
a[2][0] #2열 0행
7
a[1]
[4,5,6]
이런식으로 인덱스를 중첩하면된다. 조금더 쉽게 표현해보자
a = [1,2,3]
b = [4,5,6]
c = [7,8,9]
x = [a,b,c]
x
[[1,2,3],[4,5,6],[7,8,9]]
이렇게 된다 결국 x[0] 은 a변수고 a변수는 [1,2,3]이 되는것이다.또한 a[0]은 1이기때문에 결국
x[0][0]이 된다.
인덱스에 접근하여 값을 새 값으로 할당하는것 역시 가능하다.
반복문 한번으로 리스트의 값 가져오기
#for 반복문으로 구하기
a = [[10,20],[30,40],[50,60]]
for x,y in a:
print(x,y)
10 20
30 40
50 60
#while 반복문으로 구하기
i = 0
while i < len(a): # 반복할 때 리스트의 크기 활용(세로 크기)
x, y = a[i] # 요소 두 개를 한꺼번에 가져오기
print(x, y)
i += 1 # 인덱스를 1 증가시킴
i값은 세로값이다.
반복문 안에 들어간 x,y는 가로값의 개수와 같은 변수이고 이 변수에 가로값이 할당 되는것이다.
반복문 두번 사용하여 가져오기
#for 반복문으로 구하기
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
#while 반복문으로 구하기
i = 0
while i < len(a): # 세로 크기
j = 0
while j < len(a[i]): # 가로 크기
print(a[i][j], end=' ')
j += 1 # 가로 인덱스를 1 증가시킴
print()
i += 1 # 세로 인덱스를 1 증가
i값은 세로값 j값은 가로값에 할당되어 출력된다.
변수가 가로값보다 많다 면 어떻게될까?
Traceback (most recent call last):
File "/Users/jingkwanjung/Documents/python/1231111.py", line 2, in <module>
for x,y,z in a:
ValueError: not enough values to unpack (expected 3, got 2)
위와 같은 오류가 발생한다
반대로 가로값보다 적다면 적은갯수만큼만 순서대로 가져온다.
반복문으로 2차원 리스트 만들기
변수1 = [] #빈 리스트를 생성합니다.
for i in range(3): # range는 원하는 만큼
변수2 = [] #새로운 변수에 빈 리스트를 또생성합니다.
for j in range(2): # range는 또 원하는 만큼
변수2.append(값)
변수1.append(변수2)
#결과
[[값,값],[값,값],[값,값]]
위코드를 해석해본다면.
각각의 변수에 빈 리스트를 생성합니다.
변수1의 빈리스트는 한번만 생성되지만 변수2의 빈리스트는 i값을 반복하면서 i값만큼 생성됩니다. 즉,
변수1 = []
for i in range(3):
변수2 = []
변수.append(변수2)
#결과
[[],[],[]]
가장 외부의 빈리스트는 변수1의 리스트
안에 3개의 빈 리스트는 변수2의 리스트다
여기에 j반복문으로 안쪽 리스트의 값을 채워주면 된다.
for j in range(2):
변수2.append(0)
을 사이에 추가한다면
[[0,0][0,0],[0,0]] 이 완성된다.
리스트 표현식으로 2차원 리스트 만들기
a = []
for i in range(3):
b = []
for j in range(2):
b.append(0)
a.append(b)
#리스트 표현식
a = [[0 for j in range(2)] for i in range(3)]
기본반복문과 다르게 리스트 표현식에서는 리스트를 저장하기 위한 변수를 제외하고는 변수들이 존재하지않는다.
리스트 변수가 존재하지 않으니 메소드 또한 사용하지 않았다. 자세히 살펴보자
#리스트 표현식의 풀이 순서는 뒤에서 부터 임으로 알아보자
a = [[]for i in range(3)]
#결과
[[],[],[]]
i는 3번 반복된다 무엇을 반복하냐? 빈 공백의 리스트 [] 을 반복하는것이다.
위와 같이 for 앞에 값을 설정한다.
a = [[for j in range(2)] for i in range(3)]
위와 같이 이번에는 내부 공백리스트(a[i])에 값을 할당하기위한 접근이다.
물론 위의 코드는 문법 오류로 작동하지는 않지만 위 코드로써 내부 리스트에 접근한것이며 j반복문 앞에 할당할 값을 적어주면되다.
a = [[0 for j in range(2)] for i in range(3)]
#결과
[[0,0],[0,0],[0,0]]
이제 리스트 표현식이 완성 되었다.
a = [[0]*2 for i in range(3)]
위처럼 사용도 가능하지만 이것은 결과가 정해져있기에 사용한 접근법이다.
톱니형 리스트 만들기
a = [3,1,3,5] #가로의 크기를 저장한 리스트
b = []# 빈 리스트 생성
for i in a: #a리스트를 i에 할당된 값은 리스트의 요소지만 반복되는 횟수는 4회이다.=세로는 4
line = [] #line은 단순변수이며 이 식으로 인해 2차원 리스트가 되었다.
for j in range(i): #i의 값은 a리스트이므로 계속 변한다.즉 가로측이 변한다.
line.append(0) #반복된 횟수만큼 0을 line이란 빈리스트에 추가
b.append(line) #여러개의 0이 요소인 리스트를 빈리스트 b에 추가
#결과
[[0,0,0],[0],[0,0,0],[0,0,0,0,0]]
리스트 표현식으로 만들기
a = [[0]*i for in [3,1,3,5]]
2차원 리스트의 할당 그리고 복사
2차원리스트의 접근 그리고 할당은 앞서 배웠다.
하지만 복사 와 할당은 다른 문제다 아래를 보자
a = [[10,20],[30,40]]
b = a
b[0][0] = 123
a
[[123,20],[30,40]]
b
[[123,20],[30,40]]
위의 상황은 할당이기에 당연한 결과다 하지만 아래의 코드를 보자
a = [[10,20],[30,40]]
b = a.copy
b[0][0] = 123
a
[[123,20],[30,40]]
b
[[123,20],[30,40]]
변수 b에 a를 할당한게 아닌 a.copy즉 a를 카피한 새 리스트를 할당 했는데도 이런결과가 나왔다.
이것을 피하기 위해선 copy모듈의 deepcopy를 활용해 줘야한다.
a = [[10,20],[30,40]]
import copy
b = copy.deepcopy(a)
b[0][0] = 123
a
[[10,20],[30,40]]
b
[[123,20],[30,40]]
'Python > 기초문법' 카테고리의 다른 글
(18)서식 지정자 & 포맷 메서드 (0) | 2022.04.02 |
---|---|
(17) 문자열 메소드 (0) | 2022.04.01 |
(15) 리스트 응용하기 (응용) (0) | 2022.03.27 |
(14)index의 메소드 (0) | 2022.03.25 |
(12)반복문 for ,while (0) | 2022.03.24 |