파이썬 문자열 슬라이싱에 대해 정리
파이썬 문자열 슬라이싱을 예시와 그림으로 차근차근 설명할게요.
예제 문자열은 words = "abcdef mouse" 로 하겠습니다.
1) 기본 문법
s[start:stop:step]
s[start:stop:step]
start는 포함(inclusive), stop은 미포함(exclusive) 입니다.
step은 건너뛰기 간격(기본값 1) — 음수면 역순으로 접근합니다.
생략 시 기본값: start → 문자열 시작(양수 step), stop → 문자열 끝(양수 step), step → 1.
2) 인덱스 시각화 (words = "abcdef mouse", 길이 = 12)
인덱스 (양수): 0 1 2 3 4 5 6 7 8 9 10 11
문자열 chars: a b c d e f m o u s e
인덱스 (음수): -12 -11 -10 -9 -8 -7 -6 -5 -4 -3 -2 -1
(음수는 끝에서부터 셈; -1 이 마지막 문자)
3) 자주 쓰는 예제와 이유
words = "abcdef mouse"
print(words[5:9]) # 'f mo'
# 설명: start=5 -> 인덱스 5 = 'f' 포함.
# stop=9 -> 인덱스 9은 미포함이므로 실제 포함되는 인덱스는 5,6,7,8 -> 'f', ' ', 'm', 'o'
print(words[5:]) # 'f mouse'
# 설명: stop이 생략되었으므로 인덱스 5부터 끝(11)까지 포함.
print(words[:3]) # 'abc'
# 설명: start 생략 -> 0부터. stop=3 은 인덱스 0,1,2 만 포함.
print(words[::2]) # 'ace os'
# 설명: step=2 이므로 인덱스 0,2,4,6,8,10 선택 -> 'a','c','e',' ','o','s'
print(words[::-1]) # 'esuom fedcba'
# 설명: step=-1 -> 문자열을 뒤집은 결과. (맨 끝에서부터 -1씩)
print(words[-5:-1]) # 'mous'
# 설명: -5 -> 인덱스 7('m'), -1 -> 마지막 문자(인덱스11) 미포함 -> 포함 인덱스 7,8,9,10 -> 'm','o','u','s'
print(words[9:3:-1]) # 'uom fe'
# 설명: 시작 9(= 'u') 포함, stop=3 미포함, step=-1 이므로 9,8,7,6,5,4 -> 'u','o','m',' ','f','e'
4) 유용한 팁 / 예외
- 범위를 벗어난 인덱스(예: s[0:100])를 사용해도 에러가 나지 않고 가능한 부분만 반환됩니다.
- step = 0 은 에러(ValueError)입니다.
- 슬라이스는 새 문자열을 만듭니다(문자열은 immutable). 원본 s는 바뀌지 않습니다.
- slice() 객체를 사용하면 슬라이스를 재사용할 수 있습니다:
sl = slice(5,9)
words[sl] # 'f mo'
슬라이싱은 문자열뿐 아니라 리스트, 튜플 등 시퀀스 자료형에 모두 적용됩니다.
예제
words="abcdef mouse"
print(words[5:9])
print(words[5:])
print(words[:3])
print(words[::2])
print(words[::-1])
파이썬 소스 입니다. 결과값과 그 결과가 나온 이유를 아주 자세히 설명
words = "abcdef mouse"
print(words[5:9]) # 출력: f mo
print(words[5:]) # 출력: f mouse
print(words[:3]) # 출력: abc
print(words[::2]) # 출력: ace os
print(words[::-1]) # 출력: esuom fedcba
자세한 설명 (한 글자씩 인덱스 표시해서)
문자열은 문자 하나하나에 인덱스(번호)가 붙습니다. words = "abcdef mouse" 를 인덱스로 표시하면:
인덱스: 0 1 2 3 4 5 6 7 8 9 10 11
문자: 'a''b''c''d''e''f'' ' 'm''o''u''s''e'
0 1 2 3 4 5 6 7 8 9 10 11 ← 인덱스
(인덱스 6은 공백(space) 문자입니다 — 공백도 하나의 문자로 취급됩니다.)
파이썬의 슬라이싱 문법은 s[start:stop:step] 입니다.
- start는 포함(inclusive)입니다.
- stop은 포함하지 않음(exclusive)입니다 — 즉 stop 인덱스 바로 전까지 선택합니다.
- step은 건너뛰기 간격(간격이 1이면 연속). step이 음수면 역방향으로 진행합니다.
- start, stop, step을 생략하면 각 상황에 맞는 기본값이 사용됩니다.
각 줄별로 어떤 인덱스들이 선택되는지 보여줄게요.
- words[5:9]
- start = 5 → 인덱스 5부터 (포함)
- stop = 9 → 인덱스 9는 포함하지 않음, 따라서 선택되는 인덱스는 5,6,7,8
- 인덱스 5='f', 6=' ' (공백), 7='m', 8='o' → 이어붙이면 "f mo"
- 그래서 출력: f mo
- words[5:]
- start = 5, stop 생략 → 문자열 끝(인덱스 11)까지 선택
- 선택 인덱스: 5,6,7,8,9,10,11 → 문자: f, , m, o, u, s, e
- 결과 문자열: "f mouse"
- 출력: f mouse (공백 포함)
- words[:3]
- start 생략 → 문자열 맨 처음(인덱스 0)부터
- stop = 3 → 인덱스 3은 포함하지 않음, 따라서 선택 인덱스: 0,1,2
- 문자: a, b, c → "abc"
- 출력: abc
- words[::2]
- start와 stop 생략 → 전체 문자열 범위
- step = 2 → 2칸씩 건너뛰며 선택: 인덱스 0,2,4,6,8,10
- 해당 문자들: 0:'a', 2:'c', 4:'e', 6:' ' (공백), 8:'o', 10:'s'
- 이어붙이면 "ace os" (공백이 e와 o 사이에 들어감)
- 출력: ace os
- words[::-1]
- step = -1 → 역방향(뒤에서 앞으로 한 칸씩)
- start/stop을 생략하면 전체를 역순으로 읽음 (맨 끝에서 맨 앞까지)
- 선택되는 순서: 인덱스 11,10,9,8,7,6,5,4,3,2,1,0
- 문자들: e s u o m ' ' f e d c b a → "esuom fedcba"
- 출력: esuom fedcba
추가 팁(자주 헷갈리는 점)
- stop은 포함되지 않는다는 점이 핵심입니다 (start는 포함). 그래서 [:3]은 0,1,2만 가져옵니다.
- 공백(스페이스)도 문자입니다 — 슬라이싱 결과에 공백이 그대로 포함됩니다.
- 슬라이스가 문자열 범위를 벗어나더라도 에러가 나지 않고 가능한 범위만 반환합니다. 예: words[5:100]은 words[5:]와 동일하게 동작합니다.
- 문자열은 불변(immutable)이라서 슬라이스는 원본을 바꾸지 않고 새 문자열을 만듭니다.
좀 더 풀어서 설명)
전체 문자열 구조
인덱스: 0 1 2 3 4 5 6 7 8 9 10 11
문자: 'a' 'b' 'c' 'd' 'e' 'f' ' ' 'm' 'o' 'u' 's' 'e'
(인덱스 6은 공백(space)입니다.)
1. words[5:9]
인덱스: 0 1 2 3 4 [5] [6] [7] [8] 9 10 11
문자: 'a' 'b' 'c' 'd' 'e' [f] [ ] [m] [o] 'u' 's' 'e'
결과: f mo
5번(f)부터 시작, 9번은 포함 안 함 → 5,6,7,8만 선택
2. words[5:]
인덱스: 0 1 2 3 4 [5] [6] [7] [8] [9] [10] [11]
문자: 'a' 'b' 'c' 'd' 'e' [f] [ ] [m] [o] [u] [s] [e]
결과: f mouse
5번(f)부터 끝까지 선택
3. words[:3]
인덱스: [0] [1] [2] 3 4 5 6 7 8 9 10 11
문자: [a] [b] [c] 'd' 'e' 'f' ' ' 'm' 'o' 'u' 's' 'e'
결과: abc
0번부터 3번 직전(2번)까지
4. words[::2]
인덱스: [0] 1 [2] 3 [4] 5 [6] 7 [8] 9 [10] 11
문자: [a] 'b' [c] 'd' [e] 'f' [ ] 'm' [o] 'u' [s] 'e'
결과: ace os
0부터 시작해 2칸씩 건너뜀 → 0,2,4,6,8,10
5. words[::-1]
인덱스: [11] [10] [9] [8] [7] [6] [5] [4] [3] [2] [1] [0]
문자: [e] [s] [u] [o] [m] [ ] [f] [e] [d] [c] [b] [a]
결과: esuom fedcba
step = -1 → 뒤에서 앞으로 한 칸씩