본문 바로가기
IT지식/Python

파이썬 슬라이스(slice)

by 모두의 향연 2021. 10. 10.
728x90
반응형

1. 시퀀스 슬라이스란?

슬라이스: 무엇인가의 일부를 잘라낸다는 뜻

시퀀스 슬라이스: 시퀀스 객체의 일부를 잘라낸다.

 

2. 사용법

-시퀀스 객체[시작 인덱스:끝 인덱스]

>>> a=[1,2,3,4,5,6,7,8,9,10]
>>> a[0:3]
[1, 2, 3]

 

주의할 점: 끝 인덱스는 범위에 포함되지 않는다.

즉, 처음부터 끝까지 가져오려면 요소의 개수의 +1을 끝 인덱스로 지정해야 함

>>> a=[1,2,3,4,5,6,7,8,9,10]
>>> a[0:11]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

 

3. 시작 인덱스와 끝 인덱스가 같을 때

인덱스가 4부터 3까지 잘라서 새 리스트를 만드는 건데 범위가 이상해서 아무것도 출력되지 않음

>>> a=[1,3,5,6,7,8,9]
>>> a[4:4]
[]

 

4. 자기 자신 인덱스 출력 법

끝 인덱스에 1을 더 크게 지정하면 시작 인덱스 출력됨

>>> a=[1,3,5,6,7,8,9]

>>> a[4:5]
[7]

 

5. 리스트의 중간 부분 가져오기

>>> a=[1,3,5,6,7,8,9]
>>> a[2:6]
[5, 6, 7, 8]

 

또한, 음수를 인덱스로 지정가능

>>> a=[1,3,5,6,7,8,9]
>>> a[4:-1]
[7, 8]
>>> a[-6:-1]
[3, 5, 6, 7, 8]

 

6. 인덱스 증가폭 사용하기

>>> a=[1,3,5,6,7,8,9]
>>> a[1:7:3]
[3, 7]

다시 기억하자. 증가폭을 지정하더라도 가져오는 인덱스(끝-1)를 넘어설 수 없다.

 

7. 인덱스 생략하기

인덱스 0부터 시작하는 시작 인덱스를 생략 가능

끝 인덱스도 생략 가능

>>> a=[1,3,5,6,7,8,9]
>>> a[:5]  #원래는 a [0:5]
[1, 3, 5, 6, 7]
>>> a[2:]  #원래는 a [2:7]
[5, 6, 7, 8, 9]

 

둘 다 생략한다면? 리스트 전체를 가져온다.

>>> a=[1,3,5,6,7,8,9]

>>> a[:]
[1, 3, 5, 6, 7, 8, 9]

 

8. 인덱스를 생략하면서 증가폭 사용

>>> a=[1,3,5,6,7,8,9]

>>> a[:5:2]  #시작 인덱스 생략
[1, 5, 7]
>>> a[1::2]  #끝 인덱스 생략
[3, 6, 8]
>>> a[1:7:]  #증감 인덱스에 공백이면 1씩 증가
[3, 5, 6, 7, 8, 9]

>>> a[::2]
[1, 5, 7, 9]  #시작 인덱스와 끝 인덱스 생략이면 리스트 전체임

>>> a[::]
[1, 3, 5, 6, 7, 8, 9]  #모두 공백이면 전체 출력

>>> a[::-1]
[9, 8, 7, 6, 5, 3, 1]  #증가폭을 음수로 설정하면 반대로 뒤집어서 출력

 

9. len 응용하기

>>> a=[10,20,30,40,50,60,70,80,90]
>>> a[0:len(a)]
[10, 20, 30, 40, 50, 60, 70, 80, 90]  #a의 길이가 9니까 인덱스 8까지 출력

 

10. 튜플, range, 문자열에 슬라이스 사용하기

튜플[시작 인덱스:끝 인덱스]
튜플[시작 인덱스:끝 인덱스:인덱스 증가폭]

>>> b=(10,20,30,40,50,60,70)
>>> b[3:5]
(40, 50)
>>> b[4:]
(50, 60, 70)
>>> b[:7:2]
(10, 30, 50, 70)

 

range객체[시작 인덱스:끝 인덱스]
range객체[시작 인덱스:끝 인덱스:인덱스 증가폭]

>>> r=range(10)
>>> r
range(0, 10)
>>> r[4:7]
range(4, 7)
>>> r[:10]
range(0, 10)
>>> r[:7:2]
range(0, 7, 2)

range는 리스트, 튜플과는 달리 요소가 모두 표시되지 않고 생성 범위만 표시된다.

그럼 range객체를 리스트로 만들려면?

>>> list(r[:7:2])
[0, 2, 4, 6]

 

문자열[시작 인덱스:끝 인덱스]
문자열[시작 인덱스:끝 인덱스:인덱스 증가폭]

>>> h='Hello, world'
>>> h[2:7]
'llo, '
>>> h[2:]
'llo, world'
>>> h[::2]
'Hlo ol'

 

11. 슬라이스 객체 사용

슬라이스 객체 = slice(끝 인덱스)
슬라이스 객체 = slice(시작 인덱스, 끝 인덱스)
슬라이스 객체 = slice(시작 인덱스, 끝 인덱스, 인덱스 증가폭)
시퀀스 객체[슬라이스 객체]
시퀀스 객체.__getitem__(슬라이스 객체)

 

>>> range(10)[slice(4,8,2)]
range(4, 8, 2)

 

>>> a = [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
>>> s=slice(4,8)
>>> a[s]
[40, 50, 60, 70]

 

12. 슬라이스 요소 대체하기

>>> a = [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
>>> a [2:5]=['a', 'b', 'c']
>>> a
[0, 10, 'a', 'b', 'c', 50, 60, 70, 80, 90]  #대체됨

 

>>> a = [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
>>> a[2:5]='a'
>>> a
[0, 10, 'a', 50, 60, 70, 80, 90]   #요소의 개수가 줄어듦

슬라이스 범위보다 할당할 요소 개수가 적을 때는 리스트의 개수가 줄어든다.

반대로 요소 개수가 많으면 리스트 요소의 개수도 늘어난다.

 

>>> a = [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
>>> a [2:8:2]='a', 'b', 'c'
>>> a
[0, 10, 'a', 30, 'b', 50, 'c', 70, 80, 90]

단, 인덱스의 증가폭을 지정했을 때는 슬라이스 범위의 요소 개수가 할당할 요소 개수가 정확히 일치해야 한다.

튜플, range, 문자열은 슬라이스 범위를 지정하더라도 요소를 할당할 수 없다.

 

13. del 슬라이스 삭제

del 시퀀스 객체[시작 인덱스:끝 인덱스]

 

>>> a = [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
>>> del a[2:5]
>>> a
[0, 10, 50, 60, 70, 80, 90]

 

>>> a = [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
>>> del a[2:8:2]
>>> a
[0, 10, 30, 50, 70, 80, 90]

 

728x90
반응형

'IT지식 > Python' 카테고리의 다른 글

파이썬 if조건문  (0) 2021.10.11
파이썬 딕셔너리  (0) 2021.10.10
파이썬 인덱스(index)  (0) 2021.10.09
파이썬 시퀀스 자료형  (1) 2021.10.09
파이썬 튜플(tuple)  (0) 2021.10.08