인덱싱, 슬라이싱,
인덱싱(Indexing, 가리킴)과 슬라이싱(Slicing, 잘라냄)은 각각 문자열에서 한개 또는 여러개를 가리켜서 그 값을 가져오거나 뽑아내는 방법입니다. 파이썬에서 요긴하게 쓰이는 문법입니다.
(인덱싱과 슬라이싱은, 문자열뿐만아니라, 리스트, 튜플, 심지어 range()함수같이
순서가 있는 군집자료형(시퀀스자료형)에서도 사용할 수 있습니다.)
간단하게 배열의 요소를 가리킬때, 흔히 []을 사용하는데, 인덱싱이 이와같습니다. 슬라이싱은 그걸 확장해서 시작과 끝을 정해서 요소들을 가리키는 것입니다.
인덱싱
str1 = "언젠가 파이썬 정리도 끝나겠지?"
print(str1[2], str1[-4])
# 출력결과: 가 나
인덱싱으로 (문자열변수)[n] 과 같이, 문자열의 오른쪽에 []을 붙이고, []안에 숫자(n)를 넣어주어서 원하는 번째의 요소를 가져올 수 있습니다. (인덱스(index)를 한다해서 인덱싱이라 합니다.)
이때, [n]이라고 하면, 문자열의 인덱스 n번째에 있는 값을 가져오게 됩니다.
(인덱스는 간단히 문자열을 문자로 나누고, 첫번째 문자를 0번으로 시작해서 문자열의 끝문자까지 순서대로 매겨지는 번호를 말합니다.)
인덱스는 왼쪽 문자열부터 순서대로 세는데, 그 반대로 오른쪽 문자열순서로 가리키고 싶다면 n에 음수를 넣어주면 됩니다. 다만, 맨 마지막 문자는 -1로, -2, -3순으로 이어집니다.
슬라이싱
no_char = "언젠가 파이썬 정리도 끝나겠지?"
print(no_char[:], no_char[3:], no_char[3:7], no_char[4:7:2], no_char[6:3:-2])
# 출력결과 : 언젠가 파이썬 정리도 끝나겠지? 파이썬 정리도 끝나겠지? 파이썬 파썬 썬파
슬라이싱은 여러개의 값을 뽑아내는 것으로, 인덱싱처럼 []안의 숫자를 넣지만, 여러개를 가리키기에, 시작과 끝 인덱스 사이에 : 를 넣어 구분해줍니다. (슬라이스(slice)를 한다해서 슬라이싱입니다.)
(슬라이싱 형식 : [시작인덱스:끝인덱스] )
다양한 방식으로 사용가능한데,
(변수)[:], 빈칸은 맨끝을 나타내므로, 맨처음부터, 맨끝까지, 문자열 전체를 가리킵니다.
(변수)[n:], n번째 인덱스부터 맨 끝까지를 가리킵니다.
(변수)[:m], 맨처음부터 m-1번째 인덱스를 가리킵니다.
(변수)[n:m], n번째 인덱스부터 m-1번째 인덱스까지 가리킨다.
(변수)[n:m;s], n번째 인덱스부터 m-1번째 인덱스까지를 가리킬때, 추가로 s가 붙었는데, s는 간격(공차)으로
다시말해 s만큼 건너뛰면서 가리킨다. ( [1:10:2]이면 1,3,5,7,9번째 인덱스들을 가리키게 됩니다 )
슬라이싱에서 매우 헷갈리기 쉬우면서 중요한 특징은 [n:m]과 같이 했을때 n부터 시작해서 m까지가 아니라, m의 바로전 인덱스까지 가리킵니다.
인덱싱에서 음수를 사용했던 것처럼 n, m을 음수로 사용할 수있습니다.
특히 s, 간격(공차)를 음수로 한다면, 인덱스가 감소하는 방향으로 차례대로 값을 가져옵니다.
re = "!아찮괜라몰"
print(re[::-1])
# 출력결과: 몰라괜찮아!
위같이 해서 슬라이싱으로 문자열의 역순을 가리킬 수 있습니다.
(빈칸으로했을때, 시작인덱스부터 끝인덱스가 아니라, 공차가 음수여서그런지 알아서 끝인덱스부터 시작인덱스까지로 다르게 해석됩니다.)
인덱싱, 슬라이싱으로 할당
문자열, 리스트 등(시퀀스 자료형 = 순서가 있는 군집자료형)에서 인덱싱, 슬라이싱으로 일부를 가리킨다면,
그부분에 원하는 값을 할당할 수도 있습니다. (다만, 이땐 문자열, 튜플등은 요소 수정이 불가능 하기에 시도하면 에러납니다.)
인덱싱을 이용해서 할당할 경우, 인덱싱할때 쓴 인덱스 위치의 요소 하나를 수정(할당)할 수 있습니다.
s = ['python', '!']
s[-1] = '?'
print(s) # 출력결과 : ['python', '?']
이때 할당하는 값을 군집자료형과 같이 여러개의 요소로 한다해도, 인덱싱되는 대상의 요소 하나만 수정하는 것이기에,
여러개의 요소 묶음이 하나의 요소로 할당됩니다.
s = ['python', '!']
s[-1] = ['!', '?']
print(s) # 출력결과 ['python', ['!', '?']]
슬라이싱을 사용해 할당할 경우, 인덱싱과 다르게 한 요소를 가리키는 것이 아니라, 어디부터 어디까지의 부분을 가리키는 것이기에, 슬라이싱에서 가리킨 요소의 개수와 상관없이 요소들을 할당 할 수 있습니다.
s = [1, 2, 3]
s[0:2] = [-2, -1, 0, 1, 2]
# s[0:2]는 0부터 1인덱스 부분을 가리키는 것이기에, 슬라이싱이 가리키는 요소의 개수는 2개
# 그러나, 할당하는 값이 2개보다 크거나, 작아도 문제없음. (요소에 할당하는 것이 아니라, 부분을 할당하는 것이기에)
print(s) # 출력결과 [-2, -1, 0, 1, 2, 3]
슬라이싱으로 가리킨 부분의 요소개수보다 많은 개수의 요소를 할당할경우 슬라이싱으로 가리킨 부분 뒤의 요소들은 뒤로 밀려나며,
슬라이싱으로 가리킨 부분의 요소개수보다 적은 개수의 요소를 할당할경우 슬라이싱으로 가리킨 부분 뒤의 요소들은 앞으로 당겨지게 됩니다.
다만, [n:m:s] 와 같이 간격(s, 공차)가 주어진 상태로 슬라이싱한 경우에선, 슬라이싱한 요소개수와, 할당하는 요소개수를 동일하게 해야합니다.
어떻게보면 간단한 표현으로 문자열을 원하는 것들만 쏙쏙 가져오는 문법이 신기하기만 합니다. 그러나, 문자열을 자유자제로 변환시키는 방법은 이보다 많은데요, 다음에 배울 문자열 내장함수, 그것이 뭔가부터 해서 문자열이 과연 어디까지 변환가능할지 알아보도록 하겠습니다.
'파이썬(Python) > 문법' 카테고리의 다른 글
자료형 - 3-4. 문자열 포맷팅 (0) | 2020.03.10 |
---|---|
자료형 - 3-3. 문자열 함수 (0) | 2020.03.06 |
자료형 - 3-1. 문자열자료형 str (0) | 2020.02.22 |
파이썬의 기본연산자 (2) | 2020.02.20 |
자료형 - 2. 논리자료형 bool (0) | 2020.02.20 |