본문 바로가기
파이썬/자주하는 질문

파이썬(Python) 슬라이싱(slice) 이해하기

by J-Build 2020. 9. 8.

슬라이스(Slice)의 사용법은 아주 간단합니다.

 

먼저 기본 사용법에 대해서 알아보죠. 

items[start:stop]  # 리스트의 start 인덱스에서 stop-1 인덱스까지 슬라이싱
items[start:]      # 리스트의 start 인덱스에서 리스트의 마지막까지 슬라이싱
items[:stop]       # 리스트의 처음부터 stop-1 인덱스까지 슬라이싱
items[:]           # 리스트 전체 아이템들 반환(복사본)

 

예제 코드를 같이한번 볼께요. 

items = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

items[2:5] # 인텍스 2에서 인덱스 5까지(인덱스 5는 제외) 슬라이싱 
# [2, 3, 4]

items[5:] # 인덱스 5에서 끝까지 슬라이싱
# [5, 6, 7, 8, 9, 10]

items[:3] # 처음부터 인덱스 3까지(인덱스 3은 제외) 슬라이싱 
# [0, 1, 2]

items[:] # 처음부터 끝까지 슬라이싱(즉, 리스트 복사본 반환)
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

 

위의 기본 사용 방법에서 step을 추가해 줄 수 있어요. 그럼 step 수 만큼 점프를 해가면서 슬라이스를 하게 됩니다. 콜론(:)을 하나 더 붙이고 step 수를 넣어주면 되요. 

items[start:stop:step]

 

위의 4가지 기본 사용법에 대해서 step을 추가해보는 예제 코드입니다. 

items[2:9:3] # 인덱스 2에서 인텍스 9까지(인덱스 9는 제외) 3칸씩 점프 
# [2, 5, 8]

items[:10:2] # 처음부터 인텍스 10까지(인덱스 10은 제외) 2칸씩 점프
# [0, 2, 4, 6, 8]

items[2::2] # 인덱스 2에서 끝까지 2칸씩 점프
# [2, 4, 6, 8, 10]

items[::3] # 전체 리스트에 대해서 3칸씩 점프
# [0, 3, 6, 9]

 

슬라이스에서 start와 stop은 음수를 가질 수 있습니다. 음수 인덱스는 리스트의 뒤에서 부터 숫자를 세는것과 같아요. 따라서 음수 인덱스는 리스트의 길이를 모를때 굉장히 유용해요. 예를 들면 아래와 같죠. 

items[-1] # 리스트의 길이는 모르지만 제일 마지막 값을 알고 싶을때
# 10

items[-2] # 리스트의 길이는 모르지만 제일 마지막에서 두번째 값을 알고 싶을때
# 9

 

이제 start와 stop에 음수를 적용해 볼께요. 

items[-2:] # 마지막에서 두번째 아이템부터 리스트의 끝까지 슬라이싱
# [9, 10]

items[:-3] # 처음부터 리스트의 끝에서 세번째 아이템 전까지 슬라이싱(즉, 마지막 3개 아이템을 제외)
# [0, 1, 2, 3, 4, 5, 6, 7]

 

step도 이런 음수에 대한 규칙이 동일하게 적용됩니다. 즉, step이 -1이면 왼쪽으로 한칸씩 점프한다는 의미가 되죠. 예제 코드로 확인해 보겠습니다. 처음 음수 step을 접하면 조금 헷갈릴 수 있습니다. 파이썬 콘솔을 띄어놓고 여러가지를 테스트해보기를 추천드립니다. 

items[10:0:-3] # 인텍스 10에서 0까지(인덱스 0은 제외) 역순으로 슬라이싱
# [10, 7, 4, 1]

items[5:1:-1] # 인덱스 5에서 1까지(인텍스 1은 제외) 역순으로 슬라이싱
# [5, 4, 3, 2]

items[1::-1] # 인덱스 1에서 끝까지 역순으로 슬라이싱
# [1, 0]

items[1:10:-1] # 인텍스 1에서 인덱스 10까지(인덱스 10인 제외) 역순으로 슬라이싱, 하지만 슬라이싱 못하므로 빈 리스트 반환
# []

items[:-3:-1] # 리스트 끝에서 3번째 인덱스까지(인덱스 -3은 제외) 역순으로 슬라이싱
# [10, 9]

items[0:-3:-1] # 인텍스 0에서부터 리스트 끝에서 3번째 인덱스까지(인텍스 -3은 제외) 역순으로 슬라이싱, 하지만 슬라이싱 못하므로 빈 리스트 반환
# []

items[::-1] # 리스트 처음부터 끝까지 역순으로 슬라이싱
# [10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

items[::-2] # 리스트 처음부터 끝까지 역순으로 2칸씩 슬라이싱
# [10, 8, 6, 4, 2, 0]

 

추가적으로, 리스트에서 슬라이스(slice) 기호(:) 대신에 slice() 힘수를 사용할 수 도 있습니다. 즉, 아래 표현은

items[start:stop:step]

 

다음과 같이 slice()함수를 사용해서 표현할 수 도 있습니다. 

items[slice(start, stop, step)]

 

 

댓글