여기서는 리스트 문법보다 값 하나가 필요한지, 구간이 필요한지, 뒤에서 읽을지, 새 시퀀스를 만들지를 먼저 봅니다.
인덱싱과 슬라이싱은 리스트, 문자열, 튜플 같은 시퀀스 전반에 공통으로 들어가는 읽기 규칙입니다.
숏컷 코드
items = [10, 20, 30, 40, 50]
first = items[0]
last = items[-1]
head = items[:2]
tail = items[2:]
reversed_items = items[::-1]문법
기본형은 단일 인덱스, 음수 인덱스, 기본 슬라이스, step 슬라이스, 얕은 복사까지 같이 보면 됩니다.
value = seq[i]
last = seq[-1]
part = seq[a:b]
head = seq[:n]
tail = seq[n:]
step_part = seq[a:b:step]
copy_seq = seq[:]슬라이싱의 끝 인덱스는 포함되지 않고, 슬라이스 결과는 새 시퀀스라는 점을 같이 기억해 두면 대부분의 오해가 줄어듭니다.
단일 값
값 하나면 인덱싱으로 읽는다
items[i]는 한 요소를 읽습니다.
즉 "몇 번째 값 하나"가 목적일 때 씁니다.
word = "python"
first = word[0] # "p"
last = word[-1] # "n"음수 인덱스는 뒤에서부터 셉니다.
그래서 마지막 값은 seq[-1], 마지막에서 두 번째 값은 seq[-2]처럼 읽으면 됩니다.
구간 읽기
구간이면 슬라이싱으로 읽고, 끝 인덱스는 제외한다
seq[a:b]는 시작 인덱스부터 끝 인덱스 직전까지를 읽습니다.
즉 값 하나가 아니라 부분 시퀀스가 목적일 때 씁니다.
word = "python"
print(word[1:4]) # "yth"앞부분만 읽으면 seq[:n], 뒷부분만 읽으면 seq[n:]처럼 줄여 쓸 수 있습니다.
방향과 간격
끝에서 읽거나 건너뛰면 음수 인덱스와 step을 쓴다
뒤에서부터 접근하고 싶으면 음수 인덱스를, 일정 간격으로 건너뛰고 싶으면 step을 붙입니다.
numbers = [0, 1, 2, 3, 4, 5]
print(numbers[-2]) # 4
print(numbers[::2]) # [0, 2, 4]
print(numbers[::-1]) # [5, 4, 3, 2, 1, 0]다만 조건으로 걸러내는 작업은 슬라이싱보다 반복문이나 컴프리헨션이 더 잘 읽히는 경우가 많습니다.
복사와 공통 규칙
슬라이싱은 새 시퀀스를 만들고, 규칙은 문자열과 리스트에 같이 통한다
슬라이스 결과는 원본이 아니라 새 시퀀스입니다.
그래서 구간 분리뿐 아니라 얕은 복사에도 자주 씁니다.
items = ["a", "b", "c"]
copy_items = items[:]
head = items[:1]
rest = items[1:]이 규칙을 알면, 슬라이스 결과를 바꿔도 원본이 같이 안 바뀌는 이유를 이해하기 쉽습니다.
슬라이싱과 인덱싱은 특정 자료구조 하나의 문법이 아니라 시퀀스 전반의 공통 규칙입니다.
한 번 익혀 두면 문자열, 리스트, 튜플을 거의 같은 감각으로 읽을 수 있습니다.
주의할 점
슬라이싱의 끝 인덱스는 포함되지 않습니다. 오프바이원 실수가 자주 나는 지점입니다.
# ❌ 0,1,2,3까지 포함된다고 착각하기 쉬움
numbers = [0, 1, 2, 3, 4]
part = numbers[1:3] # [1, 2]
# ✅ 끝은 제외된다는 규칙으로 읽기
part = numbers[1:4] # [1, 2, 3]참고 링크
2 sources