[python] 2차원 리스트 사용하기

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

from pprint import pprint
# 2차원 리스트는 리스트 안에 리스트를 넣어서 만들고 각 요소에는
# 리스트[세로 인덱스][가로 인덱스]로 접근한다.
a = [[1, 2], [3, 4], [5, 6]]
a = [[1, 2],
     [3, 4],
     [5, 6]]  # 처럼 보기 쉽게 여러 줄로 적어도 된다.

# python에서는 가로 크기가 불규칙한 톱니형 리스트(jagged list)를 사용할 수 있다.
# list 조작 메소드를 이용해 동적으로 생성할 수도 있다.
a = [[1, 2],
     [3, 4, 5],
     [6],
     [7, 8, 9, 10]]
print(a)

a[2].extend([11, 12, 13, 14])
print(a)

# 2차원 튜플도 있는데,
# 튜플 안에 튜플을 넣는 방식
# 튜플 안에 리스트를 넣는 방식
# 리스트 안에 튜플을 넣는 방식 이 있다.
a = ((1, 2), (3, 4), (5, 6))  # 안쪽과 바깥쪽 요소 모두 변경 불가
b = ([1, 2], [3, 4], [5, 6])  # 안쪽 리스트만 변경 가능
c = [(1, 2), (3, 4), (5, 6)]  # 바깥쪽 리스트만 변경 가능

# 2차원 리스트/튜플의 사각형 구조를 유지하여 출력하려면 pprint모듈의 pprint 함수 사용
# indent는 들여쓰기 칸 수, width는 가로 폭
pprint(a, indent=4, width=20)

# 아래와 같이 출력된다.
# (   (1, 2),
#     (3, 4),
#     (5, 6))

반복문으로 2차원 리스트의 요소 출력하기

a = [[1, 2], [3, 4], [5, 6]]

# for문을 한번만 이용해서 접근하려면 in 앞의 변수 개수와 가로 길이가 일치해야 한다.
print('for_1')
for x, y in a:
    print(x, y)

# for문을 두번 이용해서 접근
print('for_2')
for i in a:
    for j in i:
        print(j, end=' ')
    print()

# for과 range이용
print('for_range')
for i in range(len(a)):  # 세로 길이
    for j in range(len(a[i])):  # 가로 길이
        print(a[i][j], end=' ')
    print()

# while문 한번만 이용
print('while_1')
i = 0
while i < len(a):
    x, y = a[i]
    print(x, y)
    i += 1

# while문 두번 이용
print('while_2')
i = 0
while i < len(a):  # 세로 길이
    j = 0
    while j < len(a[i]):  # 가로 길이
        print(a[i][j], end=' ')
        j += 1
    print()
    i += 1

반복문으로 리스트 만들기

# for문으로 1차원 리스트 만들기
a = []
for i in range(10):
    a.append(0)
print(a)

# for문으로 2차원 리스트 만들기
a.clear()
for i in range(3):
    line = []
    for j in range(2):
        line.append(0)
    a.append(line)
print(a)

# 리스트 표현식으로 2차원 리스트 만들기
a.clear()
a = [[0 for j in range(2)] for i in range(3)]
print(a)

a = [[0] * 2 for i in range(3)]  # 이렇게도 사용 가능하다.
print(a)

# 톱니형 리스트 만들기
a = [3, 1, 3, 2, 5]  # 가로 크기를 저장한 리스트
b = []
for i in a:
    line = []
    for j in range(i):
        line.append(0)
    b.append(line)
print(b)

b = [[0] * i for i in a]
print(b)

# 2차원 리스트를 정렬할 때는 sorted 함수를 사용한다.
# sorted(반복 가능한 객체, key=정렬함수, reverse=True 또는 False)
students = [
    ['john', 'C', 19],
    ['maria', 'A', 25],
    ['andrew', 'B', 7]
]

print(sorted(students, key=lambda student: student[1]))  # 안쪽 리스트의 인덱스 1 기준 오름차순 정렬
print(sorted(students, key=lambda student: student[2], reverse=True))  # 안쪽 리스트의 인덱스 2 기준 내림차순 정렬

2차원 리스트의 할당과 복사

import copy
# 2차원 리스트를 만든 뒤 다른 변수에 할당하고, 요소를 변경하면 두 리스트에 모두 반영된다.
a = [[1, 2], [3, 4]]
b = a
b[0][0] = 500
print(a)  # b[0][0] = 500 이 반영된다.

# 그렇다면 앞서 1차원 리스트를 복사할 때 썼던 copy 메소드를 써보면 어떨까?
a = [[1, 2], [3, 4]]
b = a.copy()
b[0][0] = 500
print(a)  # 이 경우에도 b[0][0]의 결과가 a에 반영된다.

# 2차원 이상의 다차원 리스트는 완전히 복사하려면 copy 모듈의 deepcopy 함수를 사용해아 한다.
# 튜플에서도 마찬가지이다.
a = [[1, 2], [3, 4]]
b = copy.deepcopy(a)
b[0][0] = 500
print(a)
print(b)

Updated:

Leave a comment