인덱싱(Indexing) 한다는 것은 안내 혹은 가리키는 의미이다. 도서나 프레젠테이션 자료의 Index를 떠올려보자.
슬라이싱(Slicing)은 잘라낸다는 의미이다. 얇게 잘린 슬라이스 치즈를 떠올려보자.
인덱싱과 슬라이싱은 문자열뿐만 아니라, 리스트나 튜플 등 sequence 타입의 자료형을 다룰 때 반드시 알아야 하는 개념이다.
문자열 인덱싱(Indexing)
문자열의 인덱싱은 변수 뒤에 대괄호([])를 통해 사용할 수 있다.
>>> a = "Welcome home!"
위 코드에서 a 변수에 Welcome home! 문자열을 입력했다.
이전 글에서 배운 len 함수로 문자열 a의 길이를 구해보자.
>>> print(len(a))
13
직접 세어봐도 13이 나온다.(문자열의 공백도 문자로 취급한다.)
그럼 이제 아홉 번째 자리에 있는 h를 인덱싱 해보겠다.
>>> print(a[9])
o
결과를 보니 h가 아닌 10번째에 위치한 o가 출력이 되었다.
그 이유는 파이썬이 순번을 주는 방식이 사람과 다르기 때문이다.
파이썬은 숫자를 0부터 센다.
0부터 a 문자열의 요소들에 순번을 먹이면 아래와 같이 된다.
그럼 이 번엔 아닌 8번째 자리를 인덱싱 해서 h를 출력해보자.
>>> print(a[8])
h
제대로 출력되는 모습이다.
인덱싱은 뒤에서부터 시작할 수도 있다
마이너스(-) 기호를 사용하면 문자열의 인덱싱을 반대 방향으로 하는 것도 가능하다.
>>> print(a[-1])
!
>>> print(a[-5])
h
>>> print(a[-0])
W
만약 첫 번째 숫 번이 0으로 시작한다면 Welcome home! 뒤에서 1은 두 번째니까 a[-1]은 e가 되어야 한다.
마찬가지로 a[-0]은 뒤에서 첫 번째 문자인 느낌표가 되어야 한다.
하지만 a[-1]은 두 번째 문자가 아닌 첫 번째 문자 느낌표가 출력이 되었고 a[-0]은 앞에서 첫 번째 문자인 W가 출력되었다.
그 이유는 파이썬이 반대부터 숫자를 읽을 때는 0이 아닌 1부터 숫자를 세기 때문이다.
그 이유는 0에 마이너스 부호를 붙여도 똑같이 0이기 때문이다. a[0] = a[-0]이 되는 셈이다.
문자열 슬라이싱(Slicing)
문자열 슬라이싱은 인덱싱과 크게 다르지 않다.
다만 인덱싱은 하나의 요소만 뽑아낸다면, 슬라이싱은 범위로 추출이 가능하다.
"Welcome home!" 문자열에서 뒤에 home을 인덱싱으로 추출한다면
>>> a[8] + a[9] + a[10] + a[11]
'home'
이렇게 각자의 요소들을 인덱싱 해서 더해줘야 할 것이다.
다음은 슬라이싱으로 더욱 간단하게 문자열 "home"을 추출해보자.
슬라이싱 방법
>>> a[8:12] # 슬라이싱은 콜론(:)을 사용한다.
'home'
위 예문과 같이 슬라이싱은 콜론(:)을 사용하여 범위를 지정하여 문자열 요소를 뽑아낼 수 있다.
다만 a[8]부터 a[11]까지의 요소들을 뽑아내야 하는데 a[8:12]로 범위를 지정해야 제대로 추출되는 걸 볼 수 있다.
그 이유는 슬라이싱의 범위를 입력하는 방식을 이해하면 알 수 있다.
슬라이싱 범위의 수식을 보자.
a[8:12] → 8<= a <13
위 수식을 보면 슬라이싱의 범위의 끝 번호는 포함되지 않는다.
다른 예시 코드를 더 보자.
>>> a[2:] # 2번 째 문자부터 끝까지(2~)
'lcome home!'
>>> a[8:] # 8번 째 문자부터 끝까지(8~)
'home!'
>>> a[:7] # 처음부터 7번 째 전 문자까지(0~6)
'Welcome'
>>> a[:]
'Welcome home!'
만약 슬라이싱 할 때, 시작 번호나 끝 번호를 적지 않더라도 슬라이싱이 된다.
시작 번호만 입력하면 시작 번호부터 문자열 끝까지 문자열을 슬라이싱 한다.
반대로 끝 번호만 입력하면 문자열 처음부터 끝 번호 앞까지 슬라이싱이 된다.
시작 번호 끝 번호 둘 다 적지 않는다면 처음부터 끝까지 슬라이싱이 되어 결국 a[:] = a가 된다.
마이너스(-) 슬라이싱
마이너스 기호로도 슬라이싱이 가능하다.
다만 마이너스 기호를 사용할 때는 더욱 주의가 필요하다.
위 그림을 보면서 마이너스 기호 슬라이싱을 살펴보자.
파란색이 정방향 인덱싱 번호이고, 빨간색이 역방향 인덱싱 번호이다.
그럼 "Welcome home!" 문자열에서 "home" 문자열만 슬라이싱으로 뽑아내 보자.
>>> a[-1:-6] # 뒤에서 왼쪽 방향으로 슬라이싱 - 빈 문자열 출력
''
>>> a[-5:-1] # 앞에서 오른쪽 방향으로 슬라이싱
'home'
>>> a[-5:12] # 혼합하여 슬라이싱
'home'
>>> a[8:-1] # 혼합하여 슬라이싱
'home'
첫 번째 코드 a[-1:-6]은 빈 문자열을 출력한다. 반대에서부터 문자열을 읽기 때문에 문자를 읽는 순서가 오른쪽에서 왼쪽으로 갈 것이라 착각해서 나오는 실수다. -1이 -6보다 뒤에 나오는 문자이니 제대로 출력이 되지 않는다.
두 번째 코드 a[-5:-1]은 a[-5]의 h부터 a[-1]의 앞에 있는 a[-2]의 e까지 제대로 출력이 되었다.
세 번째와 네 번째 코드는 정방향과 반대방향을 혼합하여 슬라이싱을 진행했다. 마이너스 기호가 시작 번호에 있건, 끝 번호에 있건 둘 다 제대로 작동하는 모습이다.
인덱싱 번호는 문자를 읽는 방향에 따라 두 가지로 나뉘지만 중요한 건 인덱싱 번호가 가리키는 문자의 절대적인 위치다.
마이너스 기호 여부와 상관없이 슬라이싱 범위 처음과 끝만 제대로 입력해주면 된다.
문자열 안의 문자 바꾸기
먼저 문자열처럼 squence 타입의 자료형인 리스트 자료형의 요소 하나를 바꿔보겠다.(리스트는 문자열 다음에 다루겠다.)
>>> a = [1, 2, 3]
>>> print(a)
[1, 2, 3]
>>> a[1] = 5
>>> print(a)
[1, 5, 3] # a[1]의 값이 2에서 5로 변경되었다.
a[1]에 5를 입력하니 a [1]의 값이 바뀌었다.
직관적으로 문자열도 이렇게 바꿀 수 있을 것 같다. 한 번 시도해보자.
>>> a = "Change one char"
>>> a[14]
'r'
>>> a[14] = "f" # 에러 발생
위 코드를 실행하면 에러가 발생한다.
문자열은 인덱싱하여 요소 문자를 변경하는 것이 불가능하다.
문자열을 변경하려면 replace 함수를 사용해야 한다.
>>> a = "Change one char"
>>> a.replace("r", "f")
'Change one chaf'
replace 함수를 이용해 문자열 내의 'r'을 'f'로 치환했다.
>>> print(a)
Change one char
>>> b = a.replace("r", "f")
>>> print(b)
Change one chaf
하지만 replace 함수로 문자열을 변경했지만, 원 함수인 a는 변경시키지 않는다.
따라서 변경된 문자열을 사용하려면 따로 변수를 선언해 대입해주는 것이 편하다.
곧 문자열의 여러 함수들에 대해서도 다뤄볼 것이다.
2022.09.23 - [파이썬/기초 문법] - [Python]문자열 자료형(str) 만들기 & 이스케이프 코드
'파이썬 > 기초 문법' 카테고리의 다른 글
[파이썬]문자열 함수 - 값 찾기, 개수 세기, 합치기, 나누기 (1) | 2022.09.26 |
---|---|
[파이썬]문자열 포매팅 - 포맷 코드, format 함수, f 포매팅 (1) | 2022.09.25 |
[파이썬]문자열 만들기 및 이스케이프 코드 정리 (1) | 2022.09.23 |
[파이썬]숫자 자료형 정리 - int, float, 사칙연산 (0) | 2022.09.22 |
[파이썬]Python 변수 이해하기 (0) | 2022.09.21 |
댓글