IT/파이썬

[코딩도장] day11. 2차원 리스트

_하늘여우_ 2020. 8. 23. 01:22

■ 들어가기

- 파이썬 코딩 도장 (남재윤/길벗). 을 공부하며 정리하는 블로그


▶ Unit23. 2차원 리스트 사용하기

     - 23.1 2차원 리스트를 만들고 요소에 접근하기

     - 23.2 반복문으로 2차원 리스트의 요소를 모두 출력하기

     - 23.3 반복문으로 리스트 만들기

     - 23.4 2차원 리스트의 할당과 복사 알아보기

 

>> 23.1 2차원 리스트를 만들고 요소에 접근하기 <<

- 2차원 리스트는 가로x세로 형태의 행(row), 열(coloumn)로 구성되어 있으며 인덱스 0부터 시작

- 2차원 리스트는 리스트 안에 리스트를 넣어서 생성

- 안쪽의 각 리스트는 ,(콤마) 로 구분

- 사용법 : 리스트 = [[값, 값], [값, 값], [값, 값]]

>>> a = [[10, 20], [30, 40], [50, 60]]
>>> a
[[10, 20], [30, 40], [50, 60]]
>>> b = [[10, 20],
             [30, 40],
             [50, 60]]
>>> b
[[10, 20], [30, 40], [50, 60]]

1. 2차원 리스트의 요소에 접근

- 접근 : 리스트[세로인덱스][가로인덱스]

- 값 할당 : 리스트[세로인덱스][가로인덱스] = 값

>>> a
[[10, 20], [30, 40], [50, 60]]
>>> a[0][0]
10
>>> a[0][1]
20
>>> a[2][0]
50
>>> a[0][1] = 1000
>>> 
>>> a[0][1]
1000
>>> a
[[10, 1000], [30, 40], [50, 60]]

[잠깐] 톱니형 리스트

- 위의 2차원 리스트는 가로x세로가 2x3로 가로 크기가 일정한 "사각형 리스트" 인 반면,

- 가로 크기가 불규칙한 "톱니형 리스트(jagged list)도 생성 가능!

>>> a = [[10, 20],
         [500, 600, 700],
         [9],
         [30, 40],
         [8],
         [800, 900, 1000, 2000]]
>>> a
[[10, 20], [500, 600, 700], [9], [30, 40], [8], [800, 900, 1000, 2000]]
>>> a = []
>>> a.append([])
>>> a
[[]]
>>> a[0].append(10)
>>> a
[[10]]
>>> a[0].append(20)
>>> a
[[10, 20]]
>>> a.append([])
>>> a
[[10, 20], []]
>>> a[1].append(500)
>>> a
[[10, 20], [500]]
>>> a[1].append(600)
>>> a
[[10, 20], [500, 600]]
>>> a[1].append(700)
>>> a
[[10, 20], [500, 600, 700]]

- 2차원 리스트 출력 시, 리스트의 사각형 구조 유지하도록 출력!

-> pprint모듈의 pprint 함수 사용~

>>> a
[[10, 20], [500, 600, 700]]
>>> from pprint import pprint
>>> pprint(a, indent=4, width=20)
[   [10, 20],
    [500, 600, 700]]

>> 23.2 반복문으로 2차원 리스트의 요소를 모두 출력하기 <<

- 아래 방법은 모두 가로, 세로 크기가 동일한 "사각형 리스트" 인 경우만 가능

- 그렇지 않은 리스트에서 사용 시 '에러' 발생

1. for 반복문을 한 번만 사용하기

- 사용법

for 변수1, 변수2 in 리스트 :

    코드

- in 앞의 변수는 2차원 리스트의 행(row)의 크기 (요소 개수)와 일치하여야 함!

>>> b = [[10, 20], [30, 40, 50, 60], [70], [80, 90, 100]]
>>> b
[[10, 20], [30, 40, 50, 60], [70], [80, 90, 100]]
>>> for x, y, in b :
print(x, y)


10 20
Traceback (most recent call last):
  File "<pyshell#448>", line 1, in <module>
    for x, y, in b :
ValueError: too many values to unpack (expected 2)
>>> for a, b, c, d, e in a :
print(a, b, c, d, e)


Traceback (most recent call last):
  File "<pyshell#451>", line 1, in <module>
    for a, b, c, d, e in a :
ValueError: not enough values to unpack (expected 5, got 2)
>>> for a, b, c, d in b :
print(a, b, c, d)


Traceback (most recent call last):
  File "<pyshell#454>", line 1, in <module>
    for a, b, c, d in b :
ValueError: not enough values to unpack (expected 4, got 2)

 

2. for 반복문을 두 번 사용하기

- 2차원 리스트에서 for 반복문을 두 번 사용하는 방법

- 사용법

for 변수1 in 리스트 :                      ①

    for 변수2 in 변수1 :                   ②

        코드

- ① 은 전체 2차원 리스트의 행(row)을 한 줄 씩 추출

- ② 는 ①에서 추출한row기준으로 요소를 하나 씩 추출

>>> 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 

 

3. for와 range 사용하기

- 2차원 리스트의 요소를 인덱스로 접근하는 방법

(참고) 2차원 리스트의 길이를 len()으로 구하면 리스트의 모든 요소가 아닌 행의 길이(개수)가 구해짐

>>> a
[[10, 20], [30, 40], [50, 60]]
>>> len(a)    # 2차원 리스트에서 행(row)의 개수 구함 (세로 크기)
3
>>> len(a[0])    # 2차원 리스트에서 열(column)의 개수 구함 (가로 크기)
2

(참고) 2차원 리스트의 요소 접근 시 리스트[세로인덱스][가로인덱스] 의 형식으로 접근

>>> a
[[10, 20], [30, 40], [50, 60]]
>>> for i in range(len(a)) :    # 2차원 리스트에서 행(row)의 개수 구함 (세로 크기)
for j in range(len(a[i])) :   # 2차원 리스트에서 열(column)의 개수 구함 (가로 크기)
print(a[i][j], end=' ')
print()


10 20 
30 40 
50 60

 

4. while 반복문을 한 번 사용하기

- for 반복문 한 번 사용하기와 마찬가지로 2차원 리스트의 행(row)을 먼저 추출 후, 해당 행의 열(column)을 순차적으로 조회

- 단, 열의 값을 구할 때는 열의 개수만큼 변수를 지정하여 출력하므로 열의 개수가 고정된 경우만 가능

>>> a
[[10, 20], [30, 40], [50, 60]]
>>> i = 0
>>> while i < len(a) :     # 2차원 리스트에서 행(row)의 값을 구함 (세로)
x, y = a[i]    # 2차원 리스트에서 열(column)의 값을 구함 (가로)
print(x, y)
i += 1


10 20
30 40
50 60

 

5. while 반복문을 두 번 사용하기

(참고) 2차원 리스트의 요소 접근 시 리스트[세로인덱스][가로인덱스] 의 형식으로 접근

>>> a
[[10, 20], [30, 40], [50, 60]]
>>> i = 0
>>> while i < len(a) :     # 2차원 리스트에서 행(row)의 값을 구함 (세로)
j = 0
while j < len(a[i]) :     # 2차원 리스트에서 열(column)의 값을 구함 (가로)
print(a[i][j], end=' ')
j += 1
print()
i += 1


10 20 
30 40 
50 60