[패스트캠퍼스 환급챌린지]딥러닝/Chapter 3. 파이썬

[패스트캠퍼스]Chapter 3. 딥러닝을 위한 파이썬 03-06 리스트 자료형과 튜플 자료형

포리셔 2023. 3. 29. 14:15

03-06 리스트 자료형과 튜플 자료형

프로그래밍을 할 때는 변수 한 두개를 다루는 것이 아니라 수백, 수천 개 이상의 변수를 다뤄야 할 때가 많습니다. 멀리 갈 것도 없이, 전교생의 성적을 처리할 때 학생 수가 백 명, 천 명을 넘어가는 경우는 드물지 않죠. 따라서 이와 같이 여러 변수를 하나로 묶어서 처리할 수 있는 자료형이 필요한데, 리스트(list)와 튜플(tuple)이 바로 그것입니다.

리스트 자료형

이미 자료구조 편부터 파이썬의 리스트를 각종 자료구조와 비교하면서 설명했기 때문에 익숙하실 지도 모르겠습니다.내적 친밀감 대략적으로 그 특징을 짚고 넘어가자면 아래와 같습니다.

  1. 대괄호 [] 안에 여러 원소들을 쉼표로 구분해 넣을 수 있다.
  2. 인덱싱이나 슬라이싱을 사용할 수 있다.
  3. 원소를 수정할 수 있다.(후술)
# 1번 특징
odds = [1, 3, 5, 7, 9]
print(odds)
# 2번 특징
evens = [2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
print(evens[3])
print(evens[0:5])

리스트에 들어갈 원소들의 자료형

이들 외에 몇 가지 특징을 더 추가해 설명해보겠습니다. 일반적으로 리스트의 각 원소는 같은 자료형이 되도록 쓰지만, 문법상으로는 서로 다른 자료형의 데이터가 들어갈 수도 있습니다. 아래 예시에서는 문자열, 정수형, 실수형 자료가 한 리스트 안에 들어가 있습니다.

data = ["Hello", 7, 0.5]
print(data)

리스트 덧셈

리스트끼리의 덧셈은 문자열과 유사하게 단순히 두 리스트를 이어 붙인 결과가 반환됩니다. 지금 우리는 파이썬 기본 자료형만을 쓰기 때문에 이렇게 리스트를 이어붙이는 결과가 나오지만, 추후에 본격적으로 머신러닝을 시작하면서 사용할 여러 라이브러리에서는 아래와 같은 연산을 실행하면 원소별 연산을 할 수도 있습니다.

a = [1, 2, 3, 4, 5]
b = [6, 7, 8, 9, 10]

print(a + b)

리스트 중첩

리스트는 이중, 삼중으로 중첩해서 사용할 수도 있습니다. 아래 예시를 보면, 크기 5인 서로 다른 세 개의 리스트가 arr라는 리스트에 원소로 들어가 있습니다. 이런 식으로 수학에서 행렬에 해당하는 구조를 만들 수 있습니다. 보통 딥러닝/머신러닝 분야에서는 벡터 또는 행렬 형태의 자료를 다루는 경우가 많기 때문에 이와 같이 리스트 중첩을 많이들 사용합니다.
이렇게 리스트 중첩을 했을 때 인덱싱을 하면 우리가 리스트를 몇 번 중첩했는지에 따라서 호출되는 원소가 달라집니다. 아래 예시에서 arr에 인덱싱을 두 번 적용했는데, 각각 [1, 2, 3, 4, 5][11, 12, 13, 14, 15]라는 리스트를 먼저 호출한 뒤, 그 리스트에서 [1]번째와 [2]번째 원소를 추출하여 반환하는 식입니다.

arr = [
    [1, 2, 3, 4, 5],
    [6, 7, 8, 9, 10],
    [11, 12, 13, 14, 15]
]

print(arr)
print(arr[0][1]) # 1행 2열
print(arr[2][2]) # 3행 3열

리스트가 3중 이상으로 중첩되어 있을 경우, 행렬을 넘어서 '텐서'라는 명칭을 사용합니다. 유명한 딥러닝용 라이브러리인 텐서플로(Tensorflow)가 여기서 이름을 따 왔습니다.

가변 객체

지난 포스트에서 소개한 문자열은 변경할 수 없는 불변(immutable) 객체였지만, 리스트는 가변(mutable) 객체입니다. 따라서, 원하는 인덱스의 원소를 인덱싱 또는 슬라이싱을 이용해 변경할 수 있습니다.

a = [5, 6, 7, 8, 9]

a[4] = 5
print(a)

a[0] = 1
print(a)

a[1:4] = [2, 3, 4]
print(a)

리스트 연산 메서드

자료구조 편에서 언급한 메서드 외에도 리스트 자료형에 기본적으로 제공되는 메서드들입니다.

  • insert(A, B): 리스트의 A번째 인덱스에 B를 원소로 삽입.
  • append(A): 리스트의 마지막에 A를 원소로 삽입.
  • remove(A): 리스트에서 A의 값을 가지는 원소 하나를 삭제.
  • sort(): 리스트 내의 원소를 정렬. 오름차순이 기본이며, reverse 키워드 변수를 사용해 내림차순 정렬도 가능.
arr = [1, 3, 4]

arr.insert(1, 2)
print(arr)

arr.append(5)
print(arr)

arr.remove(3)
print(arr)

arr.sort()
print(arr)

arr.sort(reverse=True)
print(arr)

리스트 컴프리헨션

파이썬에서 2차원 이상의 리스트르 초기화할 때는 컴프리헨션(comprehension)을 사용하는 것이 일반적입니다. 컴프리헨션을 초기화하면, 특정 원소를 나타내는 인덱스가 바뀐다 하더라도, 2차원 리스트의 값이 변경되지 않습니다.

# 1차원 리스트 초기화
arr = [5] * 8
print(arr)

# 2차원 리스트 초기화
arr = [[0]*5 for _ in range(4)]
print(arr)

arr = [[i]*5 for i in range(4)]
print(arr)

arr = [[(i*5) + j for j in range(5)] for i in range(4)]
print(arr)

튜플 자료형

튜플(tuple) 자료형은 리스트와 유사하지만, 그 특징은 조금씩 다릅니다. 가장 큰 차이점이라고 하면, 리스트와 달리 튜플은 값을 변경할 수 없다(immutable)는 점입니다. 이러한 점 때문인지, 대괄호 [] 를 사용해서 구분하는 리스트와 구분하기 위해 튜플 자료형은 소괄호 ()를 사용합니다. 값이 변경되면 안 되는 자료일 경우, 튜플을 사용하는 것이 효과적이라고 할 수 있겠습니다.

http://bit.ly/3Y34pE0

 

패스트캠퍼스 [직장인 실무교육]

프로그래밍, 영상편집, UX/UI, 마케팅, 데이터 분석, 엑셀강의, The RED, 국비지원, 기업교육, 서비스 제공.

fastcampus.co.kr