카테고리 없음

파이썬 문자열 슬라이싱에 대해 정리

초코생크림빵 2025. 8. 9. 17:28
반응형

파이썬 문자열 슬라이싱을 예시와 그림으로 차근차근 설명할게요.
예제 문자열은 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을 생략하면 각 상황에 맞는 기본값이 사용됩니다.

각 줄별로 어떤 인덱스들이 선택되는지 보여줄게요.

  1. words[5:9]
    • start = 5 → 인덱스 5부터 (포함)
    • stop = 9 → 인덱스 9는 포함하지 않음, 따라서 선택되는 인덱스는 5,6,7,8
    • 인덱스 5='f', 6=' ' (공백), 7='m', 8='o' → 이어붙이면 "f mo"
    • 그래서 출력: f mo
  2. words[5:]
    • start = 5, stop 생략 → 문자열 끝(인덱스 11)까지 선택
    • 선택 인덱스: 5,6,7,8,9,10,11 → 문자: f, , m, o, u, s, e
    • 결과 문자열: "f mouse"
    • 출력: f mouse (공백 포함)
  3. words[:3]
    • start 생략 → 문자열 맨 처음(인덱스 0)부터
    • stop = 3 → 인덱스 3은 포함하지 않음, 따라서 선택 인덱스: 0,1,2
    • 문자: a, b, c → "abc"
    • 출력: abc
  4. 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
  5. 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 → 뒤에서 앞으로 한 칸씩

 

반응형