슬라이스란?
시퀀스 객체의 일부를 잘라낸다는 의미
시퀀스객체[시작인덱스:끝인덱스]
예시) 리스트 슬라이스
>>> a = [0,10,20,30,40,50,60,70,80,90]
>>> a = [0:4]
[0,10,20,30]
이때 주의점! 끝 인덱스는 가져오려는 범위에 포함되지 않음
>>> a = [0,10,20,30,40,50,60,70,80,90]
>>> a[1:1]
[]
>>> a[1:2]
[10]
즉, "시작인덱스 ~ 끝인덱스-1" 를 가져오게 됨
응용) 음수 인덱스 지정
# 인덱스 4부터 -2까지 요소 5개를 가져온다.
# 음수는 숫자가 작을 수록 큰 수이다. 그래서 -1은 -2보다 1이 더 큼
>>> a[4:-1]
[40,50,60,70,80]
11.4.2 인덱스 증가폭 사용하기
시퀀스객체[시작인덱스:끝인덱스:인덱스증가폭]
인덱스의 증가폭 o , 요소의 증가폭 x
# 인덱스 2부터 3씩 증가시키면서 인덱스7까지 가져옴
>>> a = [0,10,20,30,40,50,60,70,80,90]
>>> a[2:8:3]
[20,50]
11.4.3 인덱스 생략하기
슬라이스 사용시 시작 인덱스와 끝 인덱스를 생략 가능.
인덱스를 생략하는 방법은 시퀀스 객체의 길이를 몰라도 되기 때문에 자주 쓰이는 방식이다.
주로 시퀀스 객체의 마지막 일부분만 출력시 사용
1.시퀀스객체[:끝인덱스]
처음부터 끝인덱스-1
# 리스트 처음부터 인덱스 6까지 가져옴
>>>a[:7]
[0,10,20,30,40,50,60]
2.시퀀스객체[시작인덱스:]
시작인덱스부터 끝까지
# 인덱스 7부터 마지막 요소까지 가져옴
>>>a[7:]
[70,80,90]
3.시퀀스객체[:]
시작인덱스부터 끝인덱스 => 리스트 전체
# 리스트 전체
>>>a[:]
[0,10,20,30,40,50,60,70,80,90]
4.인덱스를 생략하면서 증가폭 사용
시퀀스객체[:끝인덱스:증가폭]
시퀀스객체[시작인덱스::증가폭]
시퀀스객체[::증가폭]
시퀀스객체[::] => 이건 시퀀스객체[:] 와 동일하다.
11.4.5 len 응용하기
>>>a[0:len(a)] # a[:len(a)] 와 동일
[0,10,20,30,40,50,60,70,80,90]
11.4.6 튜플,range,문자열에 슬라이스 사용하기
1.튜플
튜플[시작인덱스:끝인덱스]
튜플[시작인덱스:끝인덱스:인덱스증가폭]
2.range
range에 슬라이스를 사용하면 지정된 범위의 숫자를 생성하는 range객체를 새로 만듬
range객체[시작인덱스:끝인덱스]
range객체[시작인덱스:끝인덱스:인덱스증가폭]
>>> r = range(10)
>>> r
range(0,10)
>>> r[4,7]
range(4,7)
>>> r[4:]
range(4,10)
>>> r[:7:2]
range(0,7,2)
range는 리스트,튜플과는 달리 요소가 모두 표시되지 않고 생성 범위만 표시됨.
이렇게 잘라낸 range객체를 리스트로 만들려면 list에 넣으면 됨
3.문자열
문자열[시작인덱스:끝인덱스]
문자열[시작인덱스:끝인덱스:인덱스증가폭]
11.4.7 slice 객체 사용하기
슬라이스 객체 = slice(끝인덱스)
슬라이스 객체 = slice(시작인덱스,끝인덱스)
슬라이스객체 = slice(시작인덱스, 끝인덱스, 인덱스증가폭)
시퀀스객체[슬라이스객체]
11.4.8 슬라이스에 요소 할당하기
>>> a[2:5] = ['a','b','c']
>>> a
[0, 10, 'a', 'b', 'c', 50, 60, 70, 80, 90]
이렇게 범위를 지정하여 요소를 할당할 경우엔 원래 있던 리스트가 변경되며 새 리스트는 생성 x
>>> a[2:5] = ['a']
>>> a
[0, 10, 'a', 50, 60, 70, 80, 90]
이와 같이 요소 개수를 맞추지 않아도 알아서 할당됨.
만약 할당할 요소 개수가 적으면 그만큼 리스트 요소 개수도 줄어듬
만약 할당한 요소 개수가 많으면 그만큼 리스트 요소 개수도 늘어남
2. 인덱스 증가폭을 지정하여 인덱스를 건너뛰면서 할당
시퀀스객체[시작인덱스:끝인덱스:인덱스증가폭] = 시퀀스객체
단, 인덱스 증가폭 지정시 슬라이스 범위의 요소 개수와 할당할 요소 개수가 정확히 일치해야된다.
그리고 튜플,range,문자열은 슬라이스 범위를 지정하더라도 요소를 할당할 수 없다.
>>> a = [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
>>> a[2:8:2] = ['a', 'b', 'c'] # 인덱스 2부터 2씩 증가시키면서 인덱스 7까지 값 할당
>>> a
[0, 10, 'a', 30, 'b', 50, 'c', 70, 80, 90]
11.4.9 del로 슬라이스 삭제하기
del 시퀀스객체[시작인덱스:끝인덱스]
del로 요소를 삭제하면 원래 있던 리스트가 변경되며 새 리스트는 생성되지 않는다.
>>> del a[2:5]
>>> a
[0, 10, 50, 60, 70, 80, 90]
이때 인덱스 증가폭을 지정하면 건너뛰면서 삭제됨
>>> del a[2:8:2] # 인덱스 2부터 2씩 증가시키면서 인덱스 6까지 삭제
>>> a
[0, 10, 30, 50, 70, 80, 90]
그리고 튜플,range,문자열은 del로 슬라이스를 삭제 불가능