리스트와 인덱스, 슬라이싱 ★★★ 시험 단골
리스트(list)는 값을 대괄호 [ ]로 묶어 줄 세운 거예요. 칸마다 번호가 있고, 번호는 0부터 시작해요. 이 번호를 인덱스(index)라고 해요.
자(ruler)의 눈금은 1cm가 아니라 0cm에서 시작해요. 리스트의 첫 칸도 "1번"이 아니라 "0번"이에요. 0번이 있어서 마지막 칸 번호는 "개수 − 1"이에요.
| 리스트 a | 10 | 20 | 30 | 40 | 50 |
|---|---|---|---|---|---|
| 앞에서 센 번호 | 0 | 1 | 2 | 3 | 4 |
| 뒤에서 센 번호 | -5 | -4 | -3 | -2 | -1 |
뒤에서부터 세고 싶으면 마이너스 번호를 써요. -1은 맨 마지막 칸이에요.
여러 칸을 한꺼번에 꺼내는 것이 슬라이싱(slicing)이에요. 모양은 a[시작:끝]이고, 끝 번호의 칸은 포함하지 않아요. "시작 칸부터 끝 번호 바로 앞 칸까지"예요.
| 코드 줄 | 무슨 뜻 |
|---|---|
a[0] | 0번 칸 → 10 |
a[-1] | 맨 마지막 칸 → 50 |
a[1:3] | 1번 칸부터 3번 앞까지 → 1번, 2번 칸 → [20, 30]. 개수는 3−1 = 2개 |
a[:2] | 시작을 비우면 "처음부터". 0번, 1번 칸 → [10, 20] |
a[2:] | 끝을 비우면 "끝까지". 2번 칸부터 마지막까지 |
a[::2] | 맨 끝의 숫자는 간격(보폭)이에요. 2칸씩 건너뛰며 → 10, 30, 50 |
len(a) | 칸 개수 = 5. 마지막 번호(4)보다 1 커요 |
a.append(60) | 리스트 맨 뒤에 60을 덧붙여요. 점(.) 쓰는 법은 0-8에서 설명해요 |
왜 끝 번호를 포함하지 않을까요? 이렇게 하면 a[0:2]와 a[2:5]를 이어 붙였을 때 빠지거나 겹치는 칸이 없어서 깔끔하기 때문이에요. 이 규칙은 다음 장 Tensor 슬라이싱에서 그대로 쓰여요.
소괄호로 묶은 튜플(tuple)도 자주 나와요. 리스트와 거의 같은데 값을 바꿀 수 없어요. 특히 원소가 하나뿐인 튜플은 쉼표를 꼭 붙여서 (3,)이라고 써요. 그냥 (3)이면 괄호 친 숫자 3일 뿐이라서 구분하려고 쉼표를 붙여요. 시험 선택지의 (3,)은 "원소가 3개인 한 줄"이라는 뜻이에요(2장).
슬라이싱 문제는 먼저 칸마다 0, 1, 2, …번호를 써 놓고 풀어요. [시작:끝]은 "시작 칸부터 끝 칸 바로 앞까지"이고 개수는 끝 − 시작이에요. 마이너스 번호는 뒤에서부터 세요.
잠깐 확인 — b = [5, 6, 7, 8, 9]일 때 b[1:4]와 b[-2:]는?
b[1:4]는 1, 2, 3번 칸이라서 [6, 7, 8]이에요. b[-2:]는 뒤에서 두 번째부터 끝까지라서 [8, 9]예요.
자료: 2~4주차 · Week02/Week03 노트북(풀이포함) · 빅분02(2주차)·빅데이터03(3주차)·빅데이터04(4주차) 녹취