본문 바로가기
Study (Data Science)/Python

Unit 22. 2차원 리스트

by 콜라찡 2022. 11. 25.

1. 기본문법

  • 요소 추출 : 리스트[세로인덱스][가로인덱스]
  • 요소 값 할당 : 리스트[세로인덱스][가로인덱스] = 값
>>> a = [[10, 20], [30, 40], [50, 60]]
>>> a[2][1]           # 출력 : 세로 인덱스 2, 가로 인덱스 0인 요소 
60
>>> a[0][1] = 1000    # 값 할당 : 세로 인덱스 0, 가로 인덱스 1인 요소에 
>>> a[0][1]
1000
  • 2차원 리스트와 튜플 수정 가능여부
a = ((10, 20), (30, 40), (50, 60))    # 튜플 안에 튜플을 넣은 2차원 튜플
b = ([10, 20], [30, 40], [50, 60])    # 튜플 안에 리스트를 넣음
c = [(10, 20), (30, 40), (50, 60)]    # 리스트 안에 튜플을 넣음

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)    # 바깥쪽 리스트는 변경할 수 있음
  • pprint (함수명, indent, width) : 보기좋게 출력하는 library. import 해야함.
>>> a = [[10, 20], [30, 40], [50, 60]]
>>> a
[[10, 20], [30, 40], [50, 60]]

>>> from pprint import pprint
>>> pprint(a, indent=4, width=20)   # 들여쓰기칸수는 4, 가로폭은 20
[   [10, 20],
    [30, 40],
    [50, 60]]

2. for문

for문 한 번 사용할 때
for문 두 번 사용할 때

# for문 1번 사용
a = [[10, 20], [30, 40], [50, 60]]
for x, y in a:    # 리스트의 가로 한 줄(안쪽 리스트)에서 요소 두 개를 꺼냄
    print(x, y)
10 20
30 40
50 60

# for문 2번 사용
for i in a:        # a에서 안쪽 리스트를 꺼냄
    for j in i:    # 안쪽 리스트에서 요소를 하나씩 꺼냄
        print(j, end=' ')
    print()

#for와 range 사용하기
a = [[10, 20], [30, 40], [50, 60]]
 
for i in range(len(a)):            # 세로 크기 i = range(3)
    for j in range(len(a[i])):     # 가로 크기 j = range(2)
        print(a[i][j], end=' ')
    print()

# while문 2번
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 증가시킴
  • 리스트 표현식으로 코드 간단히 하기
a = [3, 1, 3, 2, 5]    # 가로 크기를 저장한 리스트
b = []    # 빈 리스트 생성
 
for i in 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]]
>>> a

# 다른예시
>>> a = [[0 for j in range(2)] for i in range(3)]
>>> a
[[0, 0], [0, 0], [0, 0]]
참고 | sorted로 2차원 리스트 정렬하기

2차원 리스트를 정렬할 때는 sorted 함수를 사용합니다.

sorted(반복가능한객체, key=정렬함수, reverse=True 또는 False)

다음은 학생 정보가 저장된 2차원 리스트를 정렬합니다.

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]))  # 안쪽 리스트의 인덱스 2를 기준으로 정렬

실행 결과

[['maria', 'A', 25], ['andrew', 'B', 7], ['john', 'C', 19]]
[['andrew', 'B', 7], ['john', 'C', 19], ['maria', 'A', 25]]
  • deepcopy() : copy와 같이 리스트를 복사하는 것이지만 1차원만 통함. deep을 해야 2차원리스트가 정확히 복사됨.
# copy
>>> a = [[10, 20], [30, 40]]  
>>> b = a.copy()
>>> b[0][0] = 500
>>> a
[[500, 20], [30, 40]]
>>> b
[[500, 20], [30, 40]]       # b도 따라서 영향을 받아버렸음.. 


# deepcopy
>>> a = [[10, 20], [30, 40]]
>>> import copy             # copy 모듈을 가져옴
>>> b = copy.deepcopy(a)    # copy.deepcopy 함수를 사용하여 깊은 복사
>>> b[0][0] = 500
>>> a
[[10, 20], [30, 40]]
>>> b
[[500, 20], [30, 40]]
728x90

댓글